Browse Source

Merge branch 'master' of github.com:interlegis/sapl

pull/534/head
Eduardo Calil 9 years ago
parent
commit
73a4000cc0
  1. 2
      .travis.yml
  2. 2
      requirements/dev-requirements.txt
  3. 4
      sapl/base/urls.py
  4. 9
      sapl/materia/forms.py
  5. 12
      sapl/materia/tests/test_materia.py
  6. 3
      sapl/materia/urls.py
  7. 39
      sapl/materia/views.py
  8. 5
      sapl/parlamentares/views.py
  9. 7
      sapl/protocoloadm/views.py
  10. 4
      sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
  11. 8
      sapl/relatorios/views.py
  12. 2
      sapl/sessao/forms.py
  13. 9
      sapl/sessao/urls.py
  14. 13
      sapl/sessao/views.py
  15. 2
      sapl/templates/base.html
  16. 42
      sapl/templates/base/relatorios_list.html
  17. 2
      sapl/templates/index.html
  18. 3
      sapl/templates/materia/layouts.yaml
  19. 9
      sapl/templates/materia/proposicao_detail.html
  20. 100
      sapl/utils.py

2
.travis.yml

@ -18,5 +18,5 @@ before_script:
script:
- ./manage.py migrate
- ./manage.py bower install
- py.test
- py.test --create-db
# - ./test_and_check_qa.sh

2
requirements/dev-requirements.txt

@ -1,7 +1,7 @@
-r test-requirements.txt
autopep8==1.2.4
beautifulsoup4==4.4.1
django-debug-toolbar==1.4
django-debug-toolbar==1.5
ipdb==0.10.1
pip-review==0.4
pygraphviz==1.3.1

4
sapl/base/urls.py

@ -4,7 +4,7 @@ from django.views.generic.base import TemplateView
from .apps import AppConfig
from .forms import LoginForm
from .views import CasaLegislativaCrud, HelpView, SistemaView
from .views import CasaLegislativaCrud, HelpView
app_name = AppConfig.name
@ -12,6 +12,8 @@ app_name = AppConfig.name
urlpatterns = [
url(r'^sistema/', TemplateView.as_view(template_name='sistema.html')),
url(r'^ajuda/', TemplateView.as_view(template_name='ajuda.html')),
url(r'^relatorios/', TemplateView.as_view(
template_name='base/relatorios_list.html')),
url(r'^ajuda/(?P<topic>\w+)$', HelpView.as_view(), name='help_topic'),
url(r'^ajuda/', TemplateView.as_view(template_name='ajuda/index.html'),
name='help_base'),

9
sapl/materia/forms.py

@ -100,8 +100,8 @@ class ProposicaoForm(ModelForm):
return texto_original
def clean_data_envio(self):
data_envio = self.cleaned_data.get('data_envio')
if (not data_envio) and bool(self.initial):
data_envio = self.cleaned_data.get('data_envio') or None
if (not data_envio) and len(self.initial) > 1:
data_envio = datetime.now()
return data_envio
@ -111,8 +111,6 @@ class ProposicaoForm(ModelForm):
if cleaned_data['tipo'].descricao == 'Parecer':
if self.instance.materia:
cleaned_data['materia'] = self.instance.materia
cleaned_data['autor'] = (
self.instance.materia.autoria_set.first().autor)
else:
try:
materia = MateriaLegislativa.objects.get(
@ -124,9 +122,6 @@ class ProposicaoForm(ModelForm):
raise ValidationError(msg)
else:
cleaned_data['materia'] = materia
cleaned_data['autor'] = materia.autoria_set.first(
).autor
return cleaned_data
def save(self, commit=False):

12
sapl/materia/tests/test_materia.py

@ -1,18 +1,16 @@
import pytest
from django.contrib.auth.models import User
from django.core.files.uploadedfile import SimpleUploadedFile
from django.core.urlresolvers import reverse
from model_mommy import mommy
from sapl.comissoes.models import Comissao, TipoComissao
from sapl.materia.models import (Anexada, Autor, Autoria, DespachoInicial,
DocumentoAcessorio, MateriaLegislativa,
Numeracao, Proposicao,
RegimeTramitacao, StatusTramitacao,
TipoAutor, TipoProposicao, TipoDocumento,
TipoMateriaLegislativa, Tramitacao,
UnidadeTramitacao)
Numeracao, Proposicao, RegimeTramitacao,
StatusTramitacao, TipoAutor, TipoDocumento,
TipoMateriaLegislativa, TipoProposicao,
Tramitacao, UnidadeTramitacao)
from sapl.norma.models import (LegislacaoCitada, NormaJuridica,
TipoNormaJuridica)

3
sapl/materia/urls.py

@ -34,7 +34,8 @@ urlpatterns = [
RelatoriaCrud.get_urls() +
DocumentoAcessorioCrud.get_urls())),
url(r'^confirmar/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})$',
url(r'''^confirmar/(?P<uidb64>[0-9A-Za-z_\-]+)/
(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})$''',
ConfirmarEmailView.as_view(), name='confirmar_email'),
url(r'^proposicao/', include(ProposicaoCrud.get_urls())),

39
sapl/materia/views.py

@ -18,8 +18,7 @@ from django.template import Context, loader
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from django.utils.translation import ugettext_lazy as _
from django.views.generic import (CreateView, DetailView, ListView,
TemplateView, UpdateView)
from django.views.generic import CreateView, ListView, TemplateView, UpdateView
from django_filters.views import FilterView
from sapl.base.models import CasaLegislativa
@ -397,12 +396,21 @@ class ProposicaoCrud(Crud):
def get_initial(self):
try:
autor_id = Autor.objects.get(user=self.request.user.id).id
autor_id = Autor.objects.get(user=self.request.user).id
except MultipleObjectsReturned:
msg = _('Este usuário está relacionado a mais de um autor. ' +
'Operação cancelada')
messages.add_message(self.request, messages.ERROR, msg)
return redirect(self.get_success_url())
except ObjectDoesNotExist:
# FIXME: Pensar em uma melhor forma
tipo = TipoAutor.objects.get(name='Externo')
autor_id = Autor.objects.create(
user=self.request.user,
nome=str(self.request.user),
tipo=tipo).id
return {'autor': autor_id}
else:
return {'autor': autor_id}
@ -410,6 +418,14 @@ class ProposicaoCrud(Crud):
form_class = ProposicaoForm
permission_required = permissoes_autor()
def get_initial(self):
initial = self.initial.copy()
if self.object.materia:
initial['tipo_materia'] = self.object.materia.tipo.id
initial['numero_materia'] = self.object.materia.numero
initial['ano_materia'] = self.object.materia.ano
return initial
@property
def layout_key(self):
return 'ProposicaoCreate'
@ -436,21 +452,6 @@ class ProposicaoCrud(Crud):
class DetailView(PermissionRequiredMixin, CrudDetailView):
permission_required = permissoes_autor()
def get_context_data(self, **kwargs):
context = super(DetailView, self).get_context_data(**kwargs)
if self.object.materia:
context['form'].fields['tipo_materia'].initial = (
self.object.materia.tipo.id)
context['form'].fields['numero_materia'].initial = (
self.object.materia.numero)
context['form'].fields['ano_materia'].initial = (
self.object.materia.ano)
return context
@property
def layout_key(self):
return 'ProposicaoCreate'
def has_permission(self):
perms = self.get_permission_required()
if self.request.user.has_perms(perms):
@ -488,7 +489,7 @@ class ProposicaoCrud(Crud):
return lista
class DeleteView(PermissionRequiredMixin, CrudDeleteView):
permission_required = permissoes_materia()
permission_required = {'materia.delete_proposicao'}
def delete(self, request, *args, **kwargs):
proposicao = Proposicao.objects.get(id=self.kwargs['pk'])

5
sapl/parlamentares/views.py

@ -2,7 +2,6 @@ from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
from django.core.urlresolvers import reverse_lazy
from django.shortcuts import redirect
from django.utils.datastructures import MultiValueDictKeyError
@ -10,8 +9,8 @@ from django.utils.translation import ugettext_lazy as _
from django.views.generic import FormView
from sapl.crud.base import (Crud, CrudBaseMixin, CrudCreateView,
CrudDeleteView, CrudDetailView,
CrudListView, CrudUpdateView)
CrudDeleteView, CrudDetailView, CrudListView,
CrudUpdateView)
from sapl.crud.masterdetail import MasterDetailCrud
from sapl.utils import permissao_tb_aux, permissoes_parlamentares

7
sapl/protocoloadm/views.py

@ -24,10 +24,9 @@ from sapl.utils import (create_barcode, get_client_ip, permissoes_adm,
from .forms import (AnularProcoloAdmForm, DocumentoAcessorioAdministrativoForm,
DocumentoAdministrativoFilterSet,
DocumentoAdministrativoForm,
ProtocoloDocumentForm, ProtocoloFilterSet,
ProtocoloMateriaForm, TramitacaoAdmEditForm,
TramitacaoAdmForm)
DocumentoAdministrativoForm, ProtocoloDocumentForm,
ProtocoloFilterSet, ProtocoloMateriaForm,
TramitacaoAdmEditForm, TramitacaoAdmForm)
from .models import (Autor, DocumentoAcessorioAdministrativo,
DocumentoAdministrativo, Protocolo,
StatusTramitacaoAdministrativo,

4
sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py

@ -235,8 +235,8 @@ def votacao(lst_votacao):
txt_ementa = votacao['txt_ementa'].replace('&', '&amp;')
tmp += '<td><para style="P4">' + txt_ementa + '</para></td>\n'
tmp += '<td><para style="P3"><b>' + \
votacao['nom_resultado'] + '</b></para>\n' + '<para style="P3">' + \
votacao['votacao_observacao'] + '</para></td></tr>\n'
str(votacao['nom_resultado']) + '</b></para>\n' + '<para style="P3">' + \
str(votacao['votacao_observacao']) + '</para></td></tr>\n'
tmp += '\t\t</blockTable>\n'
return tmp

8
sapl/relatorios/views.py

@ -16,6 +16,7 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, Orador,
OradorExpediente, OrdemDia, PresencaOrdemDia,
RegistroVotacao, SessaoPlenaria,
SessaoPlenariaPresenca, TipoExpediente)
from sapl.settings import STATIC_ROOT
from sapl.utils import UF
from .templates import (pdf_capa_processo_gerar,
@ -49,12 +50,10 @@ def get_cabecalho(casa):
def get_imagem(casa):
if casa.logotipo:
return casa.logotipo.path
else:
# TODO: recuperar de uma variavel de sistema
return 'static/img/brasao_transp.gif'
return STATIC_ROOT + '/img/brasao_transp.gif'
def get_rodape(casa):
@ -564,7 +563,8 @@ def get_sessao_plenaria(sessao, casa):
materia=expediente_materia.materia).first()
if numeracao is not None:
dic_expediente_materia["des_numeracao"] = (
str(numeracao.numero) + '/' + str(numeracao.ano))
str(numeracao.numero_materia) + '/' + str(
numeracao.ano_materia))
dic_expediente_materia["des_turno"] = ' '
tram = Tramitacao.objects.filter(

2
sapl/sessao/forms.py

@ -13,7 +13,7 @@ from sapl.materia.forms import MateriaLegislativaFilterSet
from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
from sapl.utils import RANGE_DIAS_MES, RANGE_MESES, autor_label, autor_modal
from .models import Bancada, ExpedienteMateria, SessaoPlenaria, OrdemDia
from .models import Bancada, ExpedienteMateria, OrdemDia, SessaoPlenaria
def pega_anos():

9
sapl/sessao/urls.py

@ -1,11 +1,10 @@
from django.conf.urls import include, url
from sapl.sessao.views import (AdicionarVariasMateriasExpediente,
AdicionarVariasMateriasOrdemDia,
BancadaCrud, CargoBancadaCrud,
ExpedienteMateriaCrud, ExpedienteView,
MateriaOrdemDiaCrud, MesaView, OradorCrud,
OradorExpedienteCrud, PainelView,
AdicionarVariasMateriasOrdemDia, BancadaCrud,
CargoBancadaCrud, ExpedienteMateriaCrud,
ExpedienteView, MateriaOrdemDiaCrud, MesaView,
OradorCrud, OradorExpedienteCrud, PainelView,
PautaExpedienteDetail, PautaOrdemDetail,
PautaSessaoDetailView, PautaSessaoListView,
PesquisarSessaoPlenariaView,

13
sapl/sessao/views.py

@ -10,7 +10,7 @@ from django.http.response import HttpResponseRedirect
from django.utils.datastructures import MultiValueDictKeyError
from django.utils.html import strip_tags
from django.utils.translation import ugettext_lazy as _
from django.views.generic import FormView, ListView, TemplateView
from django.views.generic import ListView, TemplateView
from django.views.generic.edit import FormMixin
from django_filters.views import FilterView
from rest_framework import generics
@ -20,18 +20,16 @@ from sapl.crud.base import (Crud, CrudBaseMixin, CrudCreateView,
CrudUpdateView, make_pagination)
from sapl.crud.masterdetail import MasterDetailCrud
from sapl.materia.forms import pega_ultima_tramitacao
from sapl.materia.models import (Autoria, DocumentoAcessorio,
TipoMateriaLegislativa, Tramitacao)
from sapl.materia.models import Autoria, DocumentoAcessorio, Tramitacao
from sapl.materia.views import MateriaLegislativaPesquisaView
from sapl.norma.models import NormaJuridica
from sapl.parlamentares.models import Parlamentar
from sapl.sessao.serializers import SessaoPlenariaSerializer
from sapl.utils import permissao_tb_aux, permissoes_painel, permissoes_sessao
from .forms import (AdicionarVariasMateriasFilterSet,
BancadaForm, ExpedienteForm, ExpedienteMateriaForm,
ListMateriaForm, MesaForm,
OrdemDiaForm, PresencaForm,
from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm,
ExpedienteForm, ExpedienteMateriaForm, ListMateriaForm,
MesaForm, OrdemDiaForm, PresencaForm,
SessaoPlenariaFilterSet, VotacaoEditForm, VotacaoForm,
VotacaoNominalForm)
from .models import (Bancada, CargoBancada, CargoMesa, ExpedienteMateria,
@ -2059,7 +2057,6 @@ class AdicionarVariasMateriasExpediente(MateriaLegislativaPesquisaView):
return kwargs
def get_context_data(self, **kwargs):
# import ipdb; ipdb.set_trace()
context = super(MateriaLegislativaPesquisaView,
self).get_context_data(**kwargs)

2
sapl/templates/base.html

@ -62,7 +62,7 @@
<li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'sapl.materia:receber-proposicao' %}">Receber Proposições</a></li>
<!-- <li class="nav__sub-item"><a class="nav__sub-link" href="/materia">Protocolo Legislativo</a></li> -->
{# <li class="nav__sub-item"><a class="nav__sub-link" href="">Protocolo Geral</a></li> #}
{# <li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'sapl.protocoloadm:proposicao' %}">Proposições</a></li> #}
{# <li class="nav__sub-item"><a class="nav__sub-link" href="{% url 'sapl.materia:proposicao' %}">Proposições</a></li> #}
</ul>
</li>

42
sapl/templates/base/relatorios_list.html

@ -0,0 +1,42 @@
{% extends "base.html" %}
{% load i18n crispy_forms_tags %}
{% block base_content %}
<fieldset>
<legend>Relatórios Administrativos</legend>
<table class="table">
<thead>
<tr>
<th>Título</th>
<th>Descrição</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="">Matérias em tramitação</a></td>
<td>Matérias Legislativas por Ano, Tipo, Local atual e Status da Tramitação informados.</td>
</tr>
<tr>
<td><a href="">Proposituras por Tipo, Autor e Ano</a></td>
<td>Número de matérias legislativas, agrupadas por Tipo e Autor e Ano selecionado.</td>
</tr>
<tr>
<td><a href="">Proposituras por Autor</a></td>
<td>Resumo de Proposituras de um determinado ano, agrupadas por Autor.</td>
</tr>
<tr>
<td><a href="">Presença nas sessões</a></td>
<td>Presença dos parlamentares nas sessões plenárias.</td>
</tr>
<tr>
<td><a href="">Atas</a></td>
<td>Matérias Legislativas por Ano, Tipo, Local atual e Status da Tramitação informados.</td>
</tr>
<tr>
<td><a href="">Histórico de tramitações</a></td>
<td>Histórico de tramitações por período e local informados.</td>
</tr>
</tbody>
</table>
</fieldset
{% endblock base_content %}

2
sapl/templates/index.html

@ -156,7 +156,7 @@
Contém informações estatísticas sobre a produção legislativa dos parlamentares e da Casa, dispostas e agrupadas de diferentes formas de acordo com parâmetros fornecidos.
</p>
</div>
<a href=""></a>
<a href="/relatorios"></a>
</div>
</div>
</div>

3
sapl/templates/materia/layouts.yaml

@ -98,7 +98,8 @@ ProposicaoCreate:
{% trans 'Proposição' %}:
- tipo data_envio
- descricao
{% trans 'Materia' %}:
- tipo_materia numero_materia ano_materia
{% trans 'Complemento' %}:
- texto_original

9
sapl/templates/materia/proposicao_detail.html

@ -4,22 +4,21 @@
{% block actions %}
<div class="actions btn-group pull-right" role="group">
<<<<<<< HEAD
{% if proposicao.data_envio %}
{% if perms|get_change_perm:view %}
{% if perms|get_change_perm:view and not object.data_recebimento %}
<a href="{{ view.update_url }}" class="btn btn-default">{% trans 'Editar Proposição' %}</a>
{% endif %}
{% if perms|get_delete_perm:view %}
{% if perms|get_delete_perm:view and not object.data_recebimento %}
<a href="{{ view.delete_url }}" class="btn btn-default">{% trans 'Retornar Proposição Enviada' %}</a>
{% endif %}
{% else %}
{% if perms|get_change_perm:view %}
{% if perms|get_change_perm:view and not object.data_recebimento %}
<a href="{{ view.update_url }}" class="btn btn-default">{% trans 'Enviar/Editar Proposição' %}</a>
{% endif %}
{% if perms|get_delete_perm:view %}
{% if perms|get_delete_perm:view and not object.data_recebimento %}
<a href="{{ view.delete_url }}" class="btn btn-default">{% trans 'Excluir Proposição' %}</a>
{% endif %}
{% endif %}

100
sapl/utils.py

@ -224,73 +224,98 @@ def intervalos_tem_intersecao(a_inicio, a_fim, b_inicio, b_fim):
def permissoes_materia():
lista_permissoes = []
cts = ContentType.objects.filter(app_label='materia')
perms_materia = list(Permission.objects.filter(content_type__in=cts))
for p in perms_materia:
lista_permissoes.append('materia.' + p.codename)
try:
cts = ContentType.objects.filter(app_label='materia')
perms_materia = list(Permission.objects.filter(content_type__in=cts))
for p in perms_materia:
lista_permissoes.append('materia.' + p.codename)
except:
pass
return set(lista_permissoes)
def permissoes_comissoes():
lista_permissoes = []
cts = ContentType.objects.filter(app_label='comissoes')
perms_comissoes = list(Permission.objects.filter(content_type__in=cts))
for p in perms_comissoes:
lista_permissoes.append('comissoes.' + p.codename)
try:
cts = ContentType.objects.filter(app_label='comissoes')
perms_comissoes = list(Permission.objects.filter(content_type__in=cts))
for p in perms_comissoes:
lista_permissoes.append('comissoes.' + p.codename)
except:
pass
return set(lista_permissoes)
def permissoes_norma():
lista_permissoes = []
cts = ContentType.objects.filter(app_label='norma')
perms_norma = list(Permission.objects.filter(content_type__in=cts))
for p in perms_norma:
lista_permissoes.append('norma.' + p.codename)
try:
cts = ContentType.objects.filter(app_label='norma')
perms_norma = list(Permission.objects.filter(content_type__in=cts))
for p in perms_norma:
lista_permissoes.append('norma.' + p.codename)
except:
pass
return set(lista_permissoes)
def permissoes_parlamentares():
lista_permissoes = []
cts = ContentType.objects.filter(app_label='parlamentares')
perms_parlamentares = list(Permission.objects.filter(content_type__in=cts))
for p in perms_parlamentares:
lista_permissoes.append('parlamentares.' + p.codename)
try:
cts = ContentType.objects.filter(app_label='parlamentares')
perms_parlamentares = list(Permission.objects.filter(
content_type__in=cts))
for p in perms_parlamentares:
lista_permissoes.append('parlamentares.' + p.codename)
except:
pass
return set(lista_permissoes)
def permissoes_protocoloadm():
lista_permissoes = []
perms_protocolo = Permission.objects.filter(
group__name='Operador de Protocolo Administrativo')
for p in perms_protocolo:
lista_permissoes.append('protocoloadm.' + p.codename)
try:
perms_protocolo = Permission.objects.filter(
group__name='Operador de Protocolo Administrativo')
for p in perms_protocolo:
lista_permissoes.append('protocoloadm.' + p.codename)
except:
pass
return set(lista_permissoes)
def permissoes_adm():
lista_permissoes = []
perms_adm = Permission.objects.filter(
group__name='Operador Administrativo')
for p in perms_adm:
lista_permissoes.append('protocoloadm.' + p.codename)
try:
perms_adm = Permission.objects.filter(
group__name='Operador Administrativo')
for p in perms_adm:
lista_permissoes.append('protocoloadm.' + p.codename)
except:
pass
return set(lista_permissoes)
def permissoes_sessao():
lista_permissoes = []
perms_sessao = list(Permission.objects.filter(
group__name='Operador de Sessão Plenária'))
for p in perms_sessao:
lista_permissoes.append('sessao.' + p.codename)
try:
perms_sessao = list(Permission.objects.filter(
group__name='Operador de Sessão Plenária'))
for p in perms_sessao:
lista_permissoes.append('sessao.' + p.codename)
except:
pass
return set(lista_permissoes)
def permissoes_painel():
lista_permissoes = []
perms_painel = list(Permission.objects.filter(
group__name='Operador de Painel Eletrônico'))
for p in perms_painel:
lista_permissoes.append('painel.' + p.codename)
try:
perms_painel = list(Permission.objects.filter(
group__name='Operador de Painel Eletrônico'))
for p in perms_painel:
lista_permissoes.append('painel.' + p.codename)
except:
pass
return set(lista_permissoes)
@ -304,10 +329,13 @@ def permissao_tb_aux(self):
def permissoes_autor():
lista_permissoes = []
perms_autor = list(Permission.objects.filter(
group__name='Autor'))
for p in perms_autor:
lista_permissoes.append('materia.' + p.codename)
try:
perms_autor = list(Permission.objects.filter(
group__name='Autor'))
for p in perms_autor:
lista_permissoes.append('materia.' + p.codename)
except:
pass
return set(lista_permissoes)

Loading…
Cancel
Save