Browse Source

Merge branch 'master' into 738-refatorar-proposicoes

pull/752/head
LeandroRoberto 8 years ago
parent
commit
1576660102
  1. 1
      README.rst
  2. 14029
      echo
  3. 3
      sapl/api/forms.py
  4. 1
      sapl/api/urls.py
  5. 8
      sapl/api/views.py
  6. 8
      sapl/base/forms.py
  7. 3
      sapl/base/templatetags/menus.py
  8. 2
      sapl/base/urls.py
  9. 4
      sapl/base/views.py
  10. 2
      sapl/comissoes/views.py
  11. 7
      sapl/compilacao/views.py
  12. 5
      sapl/crud/base.py
  13. 28
      sapl/materia/forms.py
  14. 2
      sapl/materia/models.py
  15. 4
      sapl/materia/tests/test_materia.py
  16. 5
      sapl/materia/urls.py
  17. 30
      sapl/materia/views.py
  18. 5
      sapl/parlamentares/views.py
  19. 3
      sapl/protocoloadm/forms.py
  20. 7
      sapl/protocoloadm/models.py
  21. 16
      sapl/protocoloadm/views.py
  22. 2
      sapl/relatorios/templates/pdf_espelho_preparar_pysc.py
  23. 9
      sapl/relatorios/views.py
  24. 4
      sapl/sessao/models.py
  25. 1
      sapl/sessao/views.py
  26. 3
      sapl/settings.py
  27. BIN
      sapl/static/img/pdflogo.png
  28. 2
      sapl/templates/index.html
  29. 138
      sapl/templates/materia/em_lote/acessorio.html
  30. 168
      sapl/templates/materia/em_lote/tramitacao.html
  31. 6
      sapl/templates/materia/relatoria_form.html
  32. 2
      sapl/templates/sessao/pauta_sessao_filter.html
  33. 3
      sapl/test_urls.py
  34. 20
      sapl/utils.py
  35. 1
      scripts/inicializa_grupos_autorizacoes.py

1
README.rst

@ -1,6 +1,7 @@
.. image:: https://travis-ci.org/interlegis/sapl.svg?branch=master .. image:: https://travis-ci.org/interlegis/sapl.svg?branch=master
:target: https://travis-ci.org/interlegis/sapl :target: https://travis-ci.org/interlegis/sapl
*********************************************** ***********************************************
SAPL - Sistema de Apoio ao Processo Legislativo SAPL - Sistema de Apoio ao Processo Legislativo
*********************************************** ***********************************************

14029
echo

File diff suppressed because it is too large

3
sapl/api/forms.py

@ -1,9 +1,6 @@
from django.db.models import Q from django.db.models import Q
from django_filters.filters import MethodFilter, ModelChoiceFilter from django_filters.filters import MethodFilter, ModelChoiceFilter
from rest_framework.filters import FilterSet from rest_framework.filters import FilterSet
from sapl.base.models import Autor, TipoAutor from sapl.base.models import Autor, TipoAutor
from sapl.utils import generic_relations_for_model from sapl.utils import generic_relations_for_model

1
sapl/api/urls.py

@ -7,7 +7,6 @@ from sapl.api.views import MateriaLegislativaViewSet, AutorListView,\
from .apps import AppConfig from .apps import AppConfig
app_name = AppConfig.name app_name = AppConfig.name

8
sapl/api/views.py

@ -1,13 +1,9 @@
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db.models import Q from django.db.models import Q
from django.http import Http404 from django.http import Http404
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework.filters import DjangoFilterBackend from rest_framework.filters import DjangoFilterBackend
from rest_framework.generics import ListAPIView from rest_framework.generics import ListAPIView
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin from rest_framework.mixins import ListModelMixin, RetrieveModelMixin
from rest_framework.permissions import IsAuthenticated, AllowAny from rest_framework.permissions import IsAuthenticated, AllowAny
from rest_framework.viewsets import GenericViewSet from rest_framework.viewsets import GenericViewSet
@ -15,6 +11,7 @@ from rest_framework.viewsets import GenericViewSet
from sapl.api.forms import AutorChoiceFilterSet from sapl.api.forms import AutorChoiceFilterSet
from sapl.api.serializers import ChoiceSerializer, AutorSerializer,\ from sapl.api.serializers import ChoiceSerializer, AutorSerializer,\
AutorChoiceSerializer, ModelChoiceSerializer, MateriaLegislativaSerializer AutorChoiceSerializer, ModelChoiceSerializer, MateriaLegislativaSerializer
from sapl.base.models import Autor, TipoAutor from sapl.base.models import Autor, TipoAutor
from sapl.materia.models import MateriaLegislativa from sapl.materia.models import MateriaLegislativa
from sapl.utils import SaplGenericRelation, sapl_logger from sapl.utils import SaplGenericRelation, sapl_logger
@ -61,7 +58,10 @@ class AutorListView(ListAPIView):
de Autores mas feito para Possíveis Autores armazenados de Autores mas feito para Possíveis Autores armazenados
segundo o ContentType associado ao Tipo de Autor via segundo o ContentType associado ao Tipo de Autor via
relacionamento genérico. relacionamento genérico.
<<<<<<< HEAD
=======
>>>>>>> master
Busca feita sem django-filter processada no get_queryset Busca feita sem django-filter processada no get_queryset
-> processo no cadastro de autores para seleção e busca -> processo no cadastro de autores para seleção e busca
dos possíveis autores dos possíveis autores

8
sapl/base/forms.py

@ -1,4 +1,3 @@
from crispy_forms.bootstrap import FieldWithButtons, InlineRadios, StrictButton from crispy_forms.bootstrap import FieldWithButtons, InlineRadios, StrictButton
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Button, Div, Field, Fieldset, Layout, Row from crispy_forms.layout import HTML, Button, Div, Field, Fieldset, Layout, Row
@ -18,6 +17,8 @@ from django.forms import ModelForm
from django.utils.translation import ugettext_lazy as _, string_concat from django.utils.translation import ugettext_lazy as _, string_concat
import django_filters import django_filters
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import string_concat
from sapl.base.models import Autor, TipoAutor from sapl.base.models import Autor, TipoAutor
from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column, from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column,
@ -31,10 +32,8 @@ from sapl.utils import (RANGE_ANOS, ImageThumbnailFileInput,
SaplGenericRelation, models_with_gr_for_model, SaplGenericRelation, models_with_gr_for_model,
ChoiceWithoutValidationField) ChoiceWithoutValidationField)
from .models import AppConfig, CasaLegislativa from .models import AppConfig, CasaLegislativa
ACTION_CREATE_USERS_AUTOR_CHOICE = [ ACTION_CREATE_USERS_AUTOR_CHOICE = [
('C', _('Criar novo Usuário')), ('C', _('Criar novo Usuário')),
('A', _('Associar um usuário existente')), ('A', _('Associar um usuário existente')),
@ -149,7 +148,8 @@ class AutorForm(ModelForm):
autor_select = Row(to_column(('tipo', 3)), autor_select = Row(to_column(('tipo', 3)),
Div(to_column(('nome', 5)), Div(to_column(('nome', 5)),
to_column(('cargo', 4)), css_class="div_nome_cargo"), to_column(('cargo', 4)),
css_class="div_nome_cargo"),
to_column((autor_related, 9)), to_column((autor_related, 9)),
to_column((Div( to_column((Div(
Field('autor_related'), Field('autor_related'),

3
sapl/base/templatetags/menus.py

@ -1,11 +1,10 @@
import yaml
from django import template from django import template
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import yaml
from sapl.utils import sapl_logger from sapl.utils import sapl_logger
register = template.Library() register = template.Library()

2
sapl/base/urls.py

@ -3,7 +3,7 @@ from django.contrib.auth import views
from django.contrib.auth.decorators import permission_required from django.contrib.auth.decorators import permission_required
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from sapl.base.views import AutorCrud, TipoAutorCrud, ConfirmarEmailView from sapl.base.views import AutorCrud, ConfirmarEmailView, TipoAutorCrud
from .apps import AppConfig from .apps import AppConfig
from .forms import LoginForm from .forms import LoginForm

4
sapl/base/views.py

@ -9,12 +9,10 @@ from django.core.urlresolvers import reverse
from django.db.models import Count, Q from django.db.models import Count, Q
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.utils.encoding import force_bytes from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from django_filters.views import FilterView from django_filters.views import FilterView
from sapl.base.forms import AutorForm, TipoAutorForm, AutorFormForAdmin from sapl.base.forms import AutorForm, TipoAutorForm, AutorFormForAdmin
from sapl.base.models import Autor, TipoAutor from sapl.base.models import Autor, TipoAutor

2
sapl/comissoes/views.py

@ -3,7 +3,7 @@ from django.core.urlresolvers import reverse
from django.db.models import F from django.db.models import F
from django.views.generic import ListView from django.views.generic import ListView
from sapl.crud.base import Crud, CrudAux, MasterDetailCrud, RP_DETAIL, RP_LIST from sapl.crud.base import RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud
from sapl.materia.models import MateriaLegislativa, Tramitacao from sapl.materia.models import MateriaLegislativa, Tramitacao
from .models import (CargoComissao, Comissao, Composicao, Participacao, from .models import (CargoComissao, Comissao, Composicao, Participacao,

7
sapl/compilacao/views.py

@ -1,7 +1,7 @@
from collections import OrderedDict
from datetime import datetime, timedelta
import logging import logging
import sys import sys
from collections import OrderedDict
from datetime import datetime, timedelta
from braces.views import FormMessagesMixin from braces.views import FormMessagesMixin
from django import forms from django import forms
@ -20,8 +20,8 @@ from django.shortcuts import get_object_or_404, redirect
from django.utils.dateparse import parse_date from django.utils.dateparse import parse_date
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.translation import string_concat
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.translation import string_concat
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
from django.views.generic.edit import (CreateView, DeleteView, FormView, from django.views.generic.edit import (CreateView, DeleteView, FormView,
@ -49,7 +49,6 @@ from sapl.compilacao.utils import (DISPOSITIVO_SELECT_RELATED,
from sapl.crud.base import Crud, CrudListView, make_pagination from sapl.crud.base import Crud, CrudListView, make_pagination
from sapl.settings import BASE_DIR from sapl.settings import BASE_DIR
TipoNotaCrud = Crud.build(TipoNota, 'tipo_nota') TipoNotaCrud = Crud.build(TipoNota, 'tipo_nota')
TipoVideCrud = Crud.build(TipoVide, 'tipo_vide') TipoVideCrud = Crud.build(TipoVide, 'tipo_vide')
TipoPublicacaoCrud = Crud.build(TipoPublicacao, 'tipo_publicacao') TipoPublicacaoCrud = Crud.build(TipoPublicacao, 'tipo_publicacao')

5
sapl/crud/base.py

@ -16,8 +16,8 @@ from django.http.response import Http404
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils.decorators import classonlymethod from django.utils.decorators import classonlymethod
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.translation import string_concat
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.translation import string_concat
from django.views.generic import (CreateView, DeleteView, DetailView, ListView, from django.views.generic import (CreateView, DeleteView, DetailView, ListView,
UpdateView) UpdateView)
from django.views.generic.base import ContextMixin from django.views.generic.base import ContextMixin
@ -27,7 +27,6 @@ from sapl.crispy_layout_mixin import CrispyLayoutFormMixin, get_field_display
from sapl.settings import BASE_DIR from sapl.settings import BASE_DIR
from sapl.utils import normalize from sapl.utils import normalize
logger = logging.getLogger(BASE_DIR.name) logger = logging.getLogger(BASE_DIR.name)
ACTION_LIST, ACTION_CREATE, ACTION_DETAIL, ACTION_UPDATE, ACTION_DELETE = \ ACTION_LIST, ACTION_CREATE, ACTION_DETAIL, ACTION_UPDATE, ACTION_DELETE = \
@ -1311,7 +1310,7 @@ class MasterDetailCrud(Crud):
if hasattr(obj, 'parent_field'): if hasattr(obj, 'parent_field'):
parent_field = obj.parent_field.split('__') parent_field = obj.parent_field.split('__')
if not obj.is_m2m or len(parent_field) > 1: if not obj.is_m2m or len(parent_field) > 1:
field = self.model._meta.get_field(parent_field[0]) # field = self.model._meta.get_field(parent_field[0])
if isinstance(getattr( if isinstance(getattr(
self.object, parent_field[0]), models.Model): self.object, parent_field[0]), models.Model):

28
sapl/materia/forms.py

@ -4,6 +4,7 @@ import os
from crispy_forms.bootstrap import Alert, InlineCheckboxes, FormActions,\ from crispy_forms.bootstrap import Alert, InlineCheckboxes, FormActions,\
InlineRadios InlineRadios
import django_filters
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Button, Column, Fieldset, Layout, Row,\ from crispy_forms.layout import HTML, Button, Column, Fieldset, Layout, Row,\
Field, Submit Field, Submit
@ -16,7 +17,6 @@ from django.db.models import Max
from django.forms import ModelForm, widgets from django.forms import ModelForm, widgets
from django.forms.forms import Form from django.forms.forms import Form
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import django_filters
from sapl.base.models import Autor from sapl.base.models import Autor
from sapl.comissoes.models import Comissao from sapl.comissoes.models import Comissao
@ -33,10 +33,10 @@ from sapl.utils import (RANGE_ANOS, RangeWidgetOverride, autor_label,
ChoiceWithoutValidationField, YES_NO_CHOICES) ChoiceWithoutValidationField, YES_NO_CHOICES)
import sapl import sapl
from .models import (AcompanhamentoMateria, Anexada, Autoria, from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial,
DespachoInicial, DocumentoAcessorio, MateriaLegislativa, DocumentoAcessorio, MateriaLegislativa, Numeracao,
Numeracao, Proposicao, Relatoria, TipoMateriaLegislativa, Proposicao, Relatoria, TipoMateriaLegislativa, Tramitacao,
Tramitacao, UnidadeTramitacao) UnidadeTramitacao)
def ANO_CHOICES(): def ANO_CHOICES():
@ -499,6 +499,10 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
ementa = django_filters.CharFilter(lookup_expr='icontains') ementa = django_filters.CharFilter(lookup_expr='icontains')
em_tramitacao = django_filters.ChoiceFilter(required=False,
label=u'Ano da Matéria',
choices=em_tramitacao)
class Meta: class Meta:
model = MateriaLegislativa model = MateriaLegislativa
fields = ['numero', fields = ['numero',
@ -565,7 +569,7 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
'limpar Autor', 'limpar Autor',
css_class='btn btn-primary btn-sm'), 10)]) css_class='btn btn-primary btn-sm'), 10)])
row5 = to_row( row5 = to_row(
[('autoria__autor__tipo', 6), [('autoria__autor__tipo', 12),
# ('autoria__autor__partido', 6) # ('autoria__autor__partido', 6)
]) ])
row6 = to_row( row6 = to_row(
@ -1177,11 +1181,11 @@ class ConfirmarProposicaoForm(ProposicaoForm):
self.instance.save() self.instance.save()
""" """
TipoProposicao possui conteúdo genérico para a modelegam de tipos TipoProposicao possui conteúdo genérico para a modelegam de tipos
relacionados e, a esta modelagem, qual o objeto que está associado. relacionados e, a esta modelagem, qual o objeto que está associado.
Porem, cada registro a ser gerado pode possuir uma estrutura diferente, Porem, cada registro a ser gerado pode possuir uma estrutura diferente,
é os casos básicos implementados, é os casos básicos implementados,
TipoDocumento e TipoMateriaLegislativa, que são modelos utilizados TipoDocumento e TipoMateriaLegislativa, que são modelos utilizados
em DocumentoAcessorio e MateriaLegislativa geradas, em DocumentoAcessorio e MateriaLegislativa geradas,
por sua vez a partir de uma Proposição. por sua vez a partir de uma Proposição.
@ -1243,13 +1247,13 @@ class ConfirmarProposicaoForm(ProposicaoForm):
Solução pode passar pela parametrização em TipoProposicao que Solução pode passar pela parametrização em TipoProposicao que
possibilite abrir ou não espaço, dado o Tipo, para quem está possibilite abrir ou não espaço, dado o Tipo, para quem está
incorporando a proposição rediga o nome do Autor do Doc Acessório. incorporando a proposição rediga o nome do Autor do Doc Acessório.
""" """
doc.autor = str(proposicao.autor) doc.autor = str(proposicao.autor)
doc.tipo = proposicao.tipo.tipo_conteudo_related doc.tipo = proposicao.tipo.tipo_conteudo_related
doc.ementa = proposicao.descricao doc.ementa = proposicao.descricao
""" FIXME verificar questão de nome e data de documento, """ FIXME verificar questão de nome e data de documento,
doc acessório. Possivelmente pode possuir data anterior a doc acessório. Possivelmente pode possuir data anterior a
data de envio e/ou recebimento dada a incorporação. data de envio e/ou recebimento dada a incorporação.
""" """
@ -1281,8 +1285,8 @@ class ConfirmarProposicaoForm(ProposicaoForm):
""" """
apesar de TipoProposicao estar com conteudo e tipo conteudo genérico, apesar de TipoProposicao estar com conteudo e tipo conteudo genérico,
aqui na incorporação de proposições, para gerar protocolo, cada caso aqui na incorporação de proposições, para gerar protocolo, cada caso
possível de conteudo em tipo de proposição deverá ser tratado possível de conteudo em tipo de proposição deverá ser tratado
isoladamente justamente por Protocolo não estar generalizado com isoladamente justamente por Protocolo não estar generalizado com
GenericForeignKey GenericForeignKey
""" """

2
sapl/materia/models.py

@ -509,7 +509,7 @@ class Proposicao(models.Model):
""" """
FIXME Campo não é necessário na modelagem e implementação atual para o FIXME Campo não é necessário na modelagem e implementação atual para o
módulo de proposições. módulo de proposições.
E - Enviada é tratado pela condição do campo data_envio - se None n enviado E - Enviada é tratado pela condição do campo data_envio - se None n enviado
se possui uma data, enviada se possui uma data, enviada
R - Recebida é uma condição do campo data_recebimento - se None não receb. R - Recebida é uma condição do campo data_recebimento - se None não receb.

4
sapl/materia/tests/test_materia.py

@ -1,10 +1,10 @@
import pytest
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from model_mommy import mommy from model_mommy import mommy
import pytest
from sapl.base.models import TipoAutor, Autor from sapl.base.models import Autor, TipoAutor
from sapl.comissoes.models import Comissao, TipoComissao from sapl.comissoes.models import Comissao, TipoComissao
from sapl.materia.models import (Anexada, Autoria, DespachoInicial, from sapl.materia.models import (Anexada, Autoria, DespachoInicial,
DocumentoAcessorio, MateriaLegislativa, DocumentoAcessorio, MateriaLegislativa,

5
sapl/materia/urls.py

@ -3,9 +3,8 @@ from django.conf.urls import include, url
from sapl.materia.views import (AcompanhamentoConfirmarView, from sapl.materia.views import (AcompanhamentoConfirmarView,
AcompanhamentoExcluirView, AcompanhamentoExcluirView,
AcompanhamentoMateriaView, AnexadaCrud, AcompanhamentoMateriaView, AnexadaCrud,
AutoriaCrud, AutoriaCrud, ConfirmarProposicao,
ConfirmarProposicao, DespachoInicialCrud, DespachoInicialCrud, DocumentoAcessorioCrud,
DocumentoAcessorioCrud,
DocumentoAcessorioEmLoteView, DocumentoAcessorioEmLoteView,
LegislacaoCitadaCrud, MateriaLegislativaCrud, LegislacaoCitadaCrud, MateriaLegislativaCrud,
MateriaLegislativaPesquisaView, MateriaTaView, MateriaLegislativaPesquisaView, MateriaTaView,

30
sapl/materia/views.py

@ -5,7 +5,6 @@ from string import ascii_letters, digits
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML from crispy_forms.layout import HTML
from django.contrib import messages from django.contrib import messages
from django.contrib.auth import get_user_model
from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist,\ from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist,\
PermissionDenied PermissionDenied
@ -37,11 +36,13 @@ from sapl.materia.forms import AnexadaForm, LegislacaoCitadaForm,\
from sapl.norma.models import LegislacaoCitada from sapl.norma.models import LegislacaoCitada
from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label,
autor_modal, gerar_hash_arquivo, get_base_url, autor_modal, gerar_hash_arquivo, get_base_url,
montar_row_autor, permission_required_for_app,
permissoes_autor, permissoes_materia, permissoes_autor, permissoes_materia,
permissoes_protocoloadm, permission_required_for_app, permissoes_protocoloadm, permission_required_for_app,
montar_row_autor) montar_row_autor)
import sapl import sapl
from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm,
DocumentoAcessorioForm, DocumentoAcessorioForm,
MateriaLegislativaFilterSet, MateriaLegislativaFilterSet,
@ -130,7 +131,6 @@ def recuperar_materia(request):
OrgaoCrud = CrudAux.build(Orgao, 'orgao') OrgaoCrud = CrudAux.build(Orgao, 'orgao')
StatusTramitacaoCrud = CrudAux.build(StatusTramitacao, 'status_tramitacao') StatusTramitacaoCrud = CrudAux.build(StatusTramitacao, 'status_tramitacao')
UnidadeTramitacaoCrud = CrudAux.build(UnidadeTramitacao, 'unidade_tramitacao')
class TipoProposicaoCrud(CrudAux): class TipoProposicaoCrud(CrudAux):
@ -341,6 +341,32 @@ class ConfirmarProposicao(PermissionRequiredForAppCrudMixin, UpdateView):
return context return context
class UnidadeTramitacaoCrud(CrudAux):
model = UnidadeTramitacao
help_path = 'unidade_tramitacao'
class BaseMixin(Crud.BaseMixin):
list_field_names = ['comissao', 'orgao', 'parlamentar']
class ListView(Crud.ListView):
template_name = "crud/list.html"
def get_headers(self):
return [_('Unidade de Tramitação')]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
for row in context['rows']:
if row[0][0]: # Comissão
pass
elif row[1][0]: # Órgão
row[0] = (row[1][0], row[0][1])
elif row[2][0]: # Parlamentar
row[0] = (row[2][0], row[0][1])
row[1], row[2] = ('', ''), ('', '')
return context
class ProposicaoCrud(Crud): class ProposicaoCrud(Crud):
model = Proposicao model = Proposicao
help_path = '' help_path = ''

5
sapl/parlamentares/views.py

@ -12,9 +12,8 @@ from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux,
from sapl.materia.models import Proposicao, Relatoria from sapl.materia.models import Proposicao, Relatoria
from sapl.parlamentares.apps import AppConfig from sapl.parlamentares.apps import AppConfig
from .forms import (FiliacaoForm, LegislaturaCreateForm, from .forms import (FiliacaoForm, LegislaturaCreateForm, LegislaturaUpdateForm,
LegislaturaUpdateForm, ParlamentarCreateForm, ParlamentarCreateForm, ParlamentarForm)
ParlamentarForm)
from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
Dependente, Filiacao, Frente, Legislatura, Mandato, Dependente, Filiacao, Frente, Legislatura, Mandato,
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,

3
sapl/protocoloadm/forms.py

@ -1,5 +1,6 @@
from datetime import datetime from datetime import datetime
import django_filters
from crispy_forms.bootstrap import InlineRadios from crispy_forms.bootstrap import InlineRadios
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Button, Fieldset, Layout, Submit from crispy_forms.layout import HTML, Button, Fieldset, Layout, Submit
@ -8,7 +9,6 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db import models from django.db import models
from django.forms import ModelForm from django.forms import ModelForm
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import django_filters
from sapl.base.models import Autor from sapl.base.models import Autor
from sapl.crispy_layout_mixin import form_actions, to_row from sapl.crispy_layout_mixin import form_actions, to_row
@ -20,7 +20,6 @@ from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo,
Protocolo, TipoDocumentoAdministrativo, Protocolo, TipoDocumentoAdministrativo,
TramitacaoAdministrativo) TramitacaoAdministrativo)
TIPOS_PROTOCOLO = [('0', 'Enviado'), ('1', 'Recebido'), ('', 'Ambos')] TIPOS_PROTOCOLO = [('0', 'Enviado'), ('1', 'Recebido'), ('', 'Ambos')]
NATUREZA_PROCESSO = [('', 'Ambos'), NATUREZA_PROCESSO = [('', 'Ambos'),

7
sapl/protocoloadm/models.py

@ -5,6 +5,7 @@ from django.utils.translation import ugettext_lazy as _
from model_utils import Choices from model_utils import Choices
from sapl.base.models import Autor from sapl.base.models import Autor
from sapl.materia.models import (TipoMateriaLegislativa, from sapl.materia.models import (TipoMateriaLegislativa,
UnidadeTramitacao) UnidadeTramitacao)
from sapl.utils import RANGE_ANOS, YES_NO_CHOICES, texto_upload_path from sapl.utils import RANGE_ANOS, YES_NO_CHOICES, texto_upload_path
@ -25,14 +26,14 @@ class TipoDocumentoAdministrativo(models.Model):
""" """
uuid4 + filenames diversos apesar de tornar url de um arquivo praticamente uuid4 + filenames diversos apesar de tornar url de um arquivo praticamente
impossível de ser localizado não está controlando o acesso. impossível de ser localizado não está controlando o acesso.
Exemplo: o SAPL está configurado para ser docs adm restritivo porém Exemplo: o SAPL está configurado para ser docs adm restritivo porém
alguem resolve perga o link e mostrar o tal arquivo para um amigo, ou um alguem resolve perga o link e mostrar o tal arquivo para um amigo, ou um
vizinho de departamento que não possui acesso... ou mesmo alguem que nem ao vizinho de departamento que não possui acesso... ou mesmo alguem que nem ao
menos está logado... este arquivo estará livre menos está logado... este arquivo estará livre
outro caso, um funcionário bem intencionado, mas com um computador infectado outro caso, um funcionário bem intencionado, mas com um computador infectado
que consegue pegar todos os links da página que ele está acessando e esse que consegue pegar todos os links da página que ele está acessando e esse
funcionário possui permissão para ver arquivos de docs administrativos. funcionário possui permissão para ver arquivos de docs administrativos.
Consequentemente os arquivos se tornarão públicos pois podem ser acessados Consequentemente os arquivos se tornarão públicos pois podem ser acessados
via url sem controle de acesso. via url sem controle de acesso.
@ -190,8 +191,6 @@ class TramitacaoAdministrativo(models.Model):
blank=True, null=True, verbose_name=_('Data Encaminhamento')) blank=True, null=True, verbose_name=_('Data Encaminhamento'))
unidade_tramitacao_destino = models.ForeignKey( unidade_tramitacao_destino = models.ForeignKey(
UnidadeTramitacao, UnidadeTramitacao,
blank=True,
null=True,
related_name='adm_tramitacoes_destino', related_name='adm_tramitacoes_destino',
verbose_name=_('Unidade Destino')) verbose_name=_('Unidade Destino'))
texto = models.TextField( texto = models.TextField(

16
sapl/protocoloadm/views.py

@ -1,13 +1,11 @@
from datetime import date, datetime from datetime import date, datetime
import json
from braces.views import FormValidMessageMixin from braces.views import FormValidMessageMixin
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db.models import Max, Q from django.db.models import Max
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, DetailView, FormView, ListView from django.views.generic import CreateView, DetailView, FormView, ListView
@ -15,7 +13,7 @@ from django.views.generic.base import TemplateView
from django_filters.views import FilterView from django_filters.views import FilterView
from sapl.base.apps import AppConfig as AppsAppConfig from sapl.base.apps import AppConfig as AppsAppConfig
from sapl.base.models import AppConfig, Autor from sapl.base.models import AppConfig
from sapl.crud.base import Crud, CrudAux, MasterDetailCrud, make_pagination from sapl.crud.base import Crud, CrudAux, MasterDetailCrud, make_pagination
from sapl.materia.models import TipoMateriaLegislativa from sapl.materia.models import TipoMateriaLegislativa
from sapl.utils import (create_barcode, get_client_ip, permissoes_adm, from sapl.utils import (create_barcode, get_client_ip, permissoes_adm,
@ -26,12 +24,10 @@ from .forms import (AnularProcoloAdmForm, DocumentoAcessorioAdministrativoForm,
DocumentoAdministrativoForm, ProtocoloDocumentForm, DocumentoAdministrativoForm, ProtocoloDocumentForm,
ProtocoloFilterSet, ProtocoloMateriaForm, ProtocoloFilterSet, ProtocoloMateriaForm,
TramitacaoAdmEditForm, TramitacaoAdmForm) TramitacaoAdmEditForm, TramitacaoAdmForm)
from .models import (DocumentoAcessorioAdministrativo, from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo,
DocumentoAdministrativo, Protocolo, Protocolo, StatusTramitacaoAdministrativo,
StatusTramitacaoAdministrativo,
TipoDocumentoAdministrativo, TramitacaoAdministrativo) TipoDocumentoAdministrativo, TramitacaoAdministrativo)
TipoDocumentoAdministrativoCrud = CrudAux.build( TipoDocumentoAdministrativoCrud = CrudAux.build(
TipoDocumentoAdministrativo, '') TipoDocumentoAdministrativo, '')
@ -634,4 +630,4 @@ def pesquisa_autores(request):
sort_keys=True, sort_keys=True,
ensure_ascii=False), ensure_ascii=False),
content_type="application/json; charset=utf-8") content_type="application/json; charset=utf-8")
""" """

2
sapl/relatorios/templates/pdf_espelho_preparar_pysc.py

@ -60,7 +60,7 @@ if REQUEST.txt_check=='1':
REQUEST=context.REQUEST REQUEST=context.REQUEST
for materia in context.zsql.materia_obter_zsql(cod_materia=cod_mat): for materia in context.zsql.materia_obter_zsql(cod_materia=cod_mat):
dic={} dic={}
dic['titulo']="INDICAÇÃO: "+str(materia.num_ident_basica)+" "+str(materia.ano_ident_basica) dic['titulo']="INDICAÇÃO: "+str(materia.num_ident_basica)+" "+str(materia.ano_ident_basica)
dic['materia']=str(materia.num_ident_basica)+"/"+str(materia.ano_ident_basica) dic['materia']=str(materia.num_ident_basica)+"/"+str(materia.ano_ident_basica)
dic['dat_apresentacao']=materia.dat_apresentacao dic['dat_apresentacao']=materia.dat_apresentacao
dic['txt_ementa']=materia.txt_ementa dic['txt_ementa']=materia.txt_ementa

9
sapl/relatorios/views.py

@ -1,10 +1,12 @@
from datetime import datetime from datetime import datetime
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from django.core.exceptions import ObjectDoesNotExist
from django.http import Http404, HttpResponse from django.http import Http404, HttpResponse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from sapl.base.models import CasaLegislativa, Autor from sapl.base.models import Autor, CasaLegislativa
from sapl.comissoes.models import Comissao from sapl.comissoes.models import Comissao
from sapl.materia.models import (Autoria, MateriaLegislativa, Numeracao, from sapl.materia.models import (Autoria, MateriaLegislativa, Numeracao,
Tramitacao, UnidadeTramitacao) Tramitacao, UnidadeTramitacao)
@ -783,7 +785,10 @@ def relatorio_sessao_plenaria(request, pk):
rodape = get_rodape(casa) rodape = get_rodape(casa)
imagem = get_imagem(casa) imagem = get_imagem(casa)
sessao = SessaoPlenaria.objects.get(id=pk) try:
sessao = SessaoPlenaria.objects.get(id=pk)
except ObjectDoesNotExist:
raise Http404('Essa página não existe')
(inf_basicas_dic, (inf_basicas_dic,
lst_mesa, lst_mesa,

4
sapl/sessao/models.py

@ -6,8 +6,8 @@ from sapl.base.models import Autor
from sapl.materia.models import MateriaLegislativa from sapl.materia.models import MateriaLegislativa
from sapl.parlamentares.models import (CargoMesa, Legislatura, Parlamentar, from sapl.parlamentares.models import (CargoMesa, Legislatura, Parlamentar,
Partido, SessaoLegislativa) Partido, SessaoLegislativa)
from sapl.utils import YES_NO_CHOICES, restringe_tipos_de_arquivo_txt,\ from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation,
SaplGenericRelation restringe_tipos_de_arquivo_txt)
class CargoBancada(models.Model): class CargoBancada(models.Model):

1
sapl/sessao/views.py

@ -45,7 +45,6 @@ from .models import (Bancada, Bloco, CargoBancada, CargoMesa,
SessaoPlenariaPresenca, TipoExpediente, SessaoPlenariaPresenca, TipoExpediente,
TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar) TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar)
TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria')
TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente') TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente')
CargoBancadaCrud = CrudAux.build(CargoBancada, '') CargoBancadaCrud = CrudAux.build(CargoBancada, '')

3
sapl/settings.py

@ -23,7 +23,6 @@ from unipath import Path
from .temp_suppress_crispy_form_warnings import \ from .temp_suppress_crispy_form_warnings import \
SUPRESS_CRISPY_FORM_WARNINGS_LOGGING SUPRESS_CRISPY_FORM_WARNINGS_LOGGING
BASE_DIR = Path(__file__).ancestor(1) BASE_DIR = Path(__file__).ancestor(1)
PROJECT_DIR = Path(__file__).ancestor(2) PROJECT_DIR = Path(__file__).ancestor(2)
@ -98,7 +97,7 @@ MIDDLEWARE_CLASSES = (
REST_FRAMEWORK = { REST_FRAMEWORK = {
"DEFAULT_RENDERER_CLASSES": ( "DEFAULT_RENDERER_CLASSES": (
"rest_framework.renderers.JSONRenderer", "rest_framework.renderers.JSONRenderer",
#"rest_framework.renderers.BrowsableAPIRenderer", # "rest_framework.renderers.BrowsableAPIRenderer",
), ),
"DEFAULT_PARSER_CLASSES": ( "DEFAULT_PARSER_CLASSES": (
"rest_framework.parsers.JSONParser", "rest_framework.parsers.JSONParser",

BIN
sapl/static/img/pdflogo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

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. 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> </p>
</div> </div>
<a href="/relatorios"></a> <a href="/sistema/relatorios/"></a>
</div> </div>
</div> </div>
</div> </div>

138
sapl/templates/materia/em_lote/acessorio.html

@ -14,87 +14,87 @@
{% else %} {% else %}
<h3 style="text-align: right;">{% blocktrans with object_list.count as total_materias %}Foram encontradas {{total_materias}} matérias.{% endblocktrans %}</h3> <h3 style="text-align: right;">{% blocktrans with object_list.count as total_materias %}Foram encontradas {{total_materias}} matérias.{% endblocktrans %}</h3>
{% endif %} {% endif %}
{% else %} <form method="POST">
<tr><td><h3 style="text-align: right;">Nenhuma matéria encontrada.</h3></td></tr> {% csrf_token %}
{% endif %} <fieldset>
<form method="POST"> <legend>Documento Acessório</legend>
{% csrf_token %} <div class="row">
<fieldset> <div class="col-md-4">
<legend>Documento Acessório</legend> <label>Tipo*</label>
<div class="row"> <select name="tipo" class="form-control" required="True">
<div class="col-md-4"> {% for t in tipos_docs %} <option>{{t}}</option> {% endfor %}
<label>Tipo*</label> </select>
<select name="tipo" class="form-control" required="True"> </div>
{% for t in tipos_docs %} <option>{{t}}</option> {% endfor %}
</select>
</div>
<div class="col-md-4"> <div class="col-md-4">
<label>Nome*</label> <label>Nome*</label>
<input type="text" name="nome" class="form-control" required="True"> <input type="text" name="nome" class="form-control" required="True">
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<label>Data*</label> <label>Data*</label>
<input type="text" name="data" class="form-control dateinput" required="True"> <input type="text" name="data" class="form-control dateinput" required="True">
</div>
</div> </div>
</div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<label>Autor:</label> <label>Autor:</label>
<span id="nome_autor" name="nome_autor"> </span> <span id="nome_autor" name="nome_autor"> </span>
</div> </div>
<div id="modal_autor" title="Selecione o Autor" align="center"> <div id="modal_autor" title="Selecione o Autor" align="center">
<input id="q" type="text" /> <input id="pesquisar" type="submit" value="Pesquisar" class="btn btn-primary btn-sm"/> <input id="q" type="text" /> <input id="pesquisar" type="submit" value="Pesquisar" class="btn btn-primary btn-sm"/>
<div id="div-resultado"></div> <div id="div-resultado"></div>
<input type="submit" id="selecionar" value="Selecionar" hidden="true" /> <input type="submit" id="selecionar" value="Selecionar" hidden="true" />
</div> </div>
<div class="row-fluid"> <div class="row-fluid">
<div class="col-md-0"><input id="id_autor" maxlength="50" name="autor" type="hidden" /></div> <div class="col-md-0"><input id="id_autor" maxlength="50" name="autor" type="hidden" /></div>
<div class="col-md-2"><input type="button" name="pesquisar" value="Pesquisar Autor" class="btn btn btn-primary btn-sm" id="button-id-pesquisar"/></div> <div class="col-md-2"><input type="button" name="pesquisar" value="Pesquisar Autor" class="btn btn btn-primary btn-sm" id="button-id-pesquisar"/></div>
<div class="col-md-10"><input type="button" name="limpar" value="Limpar Autor" class="btn btn btn-primary btn-sm" id="button-id-limpar"/></div> <div class="col-md-10"><input type="button" name="limpar" value="Limpar Autor" class="btn btn btn-primary btn-sm" id="button-id-limpar"/></div>
</div>
</div> </div>
</div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<label>Ementa</label> <label>Ementa</label>
<textarea name="ementa" class="textarea form-control" cols="40" rows="10"></textarea> <textarea name="ementa" class="textarea form-control" cols="40" rows="10"></textarea>
</div>
</div> </div>
</div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<label>Texto Integral*</label> <label>Texto Integral*</label>
<input type="file" name="arquivo" required="True"> <input type="file" name="arquivo" required="True">
</div>
</div> </div>
</div> </fieldset>
</fieldset>
<br /><br /><br /> <br /><br /><br />
<fieldset> <fieldset>
<legend>Matérias para inclusão do Documento Acessório</legend> <legend>Matérias para inclusão do Documento Acessório</legend>
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead> <thead>
<tr><th>Matéria</th></tr> <tr><th>Matéria</th></tr>
</thead> </thead>
<tbody> <tbody>
{% for materia in object_list %} {% for materia in object_list %}
<tr> <tr>
<td> <td>
<input type="checkbox" name="materia_id" value="{{materia.id}}" {% if check %} checked {% endif %}/> <input type="checkbox" name="materia_id" value="{{materia.id}}" {% if check %} checked {% endif %}/>
{{materia.tipo.sigla}} {{materia.numero}}/{{materia.ano}} - {{materia.tipo.descricao}} {{materia.tipo.sigla}} {{materia.numero}}/{{materia.ano}} - {{materia.tipo.descricao}}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</fieldset> </fieldset>
<input type="submit" value="Salvar" class="btn btn-primary"S> <input type="submit" value="Salvar" class="btn btn-primary"S>
</form> </form>
{% else %}
<tr><td><h3 style="text-align: right;">Nenhuma matéria encontrada.</h3></td></tr>
{% endif %}
{% endif %} {% endif %}
{% endblock detail_content %} {% endblock detail_content %}

168
sapl/templates/materia/em_lote/tramitacao.html

@ -14,104 +14,104 @@
{% else %} {% else %}
<h3 style="text-align: right;">Foram encontradas {{object_list|length}} matérias.</h3> <h3 style="text-align: right;">Foram encontradas {{object_list|length}} matérias.</h3>
{% endif %} {% endif %}
{% else %} <form method="POST">
<tr><td><h3 style="text-align: right;">Nenhuma matéria encontrada.</h3></td></tr> {% csrf_token %}
{% endif %} <fieldset>
<form method="POST"> <legend>1. Detalhes da tramitação:</legend>
{% csrf_token %}
<fieldset>
<legend>1. Detalhes da tramitação:</legend>
<div class="row"> <div class="row">
<div class="col-md-4"> <div class="col-md-4">
<label>Data da Tramitação*</label> <label>Data da Tramitação*</label>
<input type="text" name="data_tramitacao" class="form-control dateinput" required="True"> <input type="text" name="data_tramitacao" class="form-control dateinput" required="True">
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<label>Data Encaminhamento</label> <label>Data Encaminhamento</label>
<input type="text" name="data_encaminhamento" class="form-control dateinput"> <input type="text" name="data_encaminhamento" class="form-control dateinput">
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<label>Data Fim do Prazo</label> <label>Data Fim do Prazo</label>
<input type="text" name="data_fim_prazo" class="form-control dateinput"> <input type="text" name="data_fim_prazo" class="form-control dateinput">
</div>
</div> </div>
</div>
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<label>Unidade Local*</label> <label>Unidade Local*</label>
{% if unidade_local|length > 1 %}<option></option>{% endif %} {% if unidade_local|length > 1 %}<option></option>{% endif %}
<select name="unidade_tramitacao_local" class="form-control" required="True"> <select name="unidade_tramitacao_local" class="form-control" required="True">
{% for u in unidade_local %} <option value="{{u.id}}">{{u}}</option> {% endfor %} {% for u in unidade_local %} <option value="{{u.id}}">{{u}}</option> {% endfor %}
</select> </select>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label>Unidade Destino*</label> <label>Unidade Destino*</label>
<select name="unidade_tramitacao_destino" class="form-control" required="True"> <select name="unidade_tramitacao_destino" class="form-control" required="True">
<option></option> <option></option>
{% for u in unidade_destino %} <option value="{{u.id}}">{{u}}</option> {% endfor %} {% for u in unidade_destino %} <option value="{{u.id}}">{{u}}</option> {% endfor %}
</select> </select>
</div>
</div> </div>
</div>
<div class="row"> <div class="row">
<div class="col-md-4"> <div class="col-md-4">
<label>Status*</label> <label>Status*</label>
<select name="status" class="form-control" required="True"> <select name="status" class="form-control" required="True">
<option></option> <option></option>
{% for s in status_tramitacao %} <option value="{{s.id}}">{{s}}</option> {% endfor %} {% for s in status_tramitacao %} <option value="{{s.id}}">{{s}}</option> {% endfor %}
</select> </select>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<label>Urgente?*</label> <label>Urgente?*</label>
<select name="urgente" class="form-control" required="True"> <select name="urgente" class="form-control" required="True">
<option></option> <option></option>
{% for u in urgente_tramitacao %} <option value="{{u|first}}">{{u|last}}</option> {% endfor %} {% for u in urgente_tramitacao %} <option value="{{u|first}}">{{u|last}}</option> {% endfor %}
</select> </select>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<label>Turno</label> <label>Turno</label>
<select name="turno" class="form-control"> <select name="turno" class="form-control">
<option></option> <option></option>
{% for t in turnos_tramitacao %} <option value="{{t|first}}">{{t|last}}</option> {% endfor %} {% for t in turnos_tramitacao %} <option value="{{t|first}}">{{t|last}}</option> {% endfor %}
</select> </select>
</div>
</div> </div>
</div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<label>Texto da Ação*</label> <label>Texto da Ação*</label>
<textarea name="texto" class="textarea form-control" cols="40" rows="10" required="True"></textarea> <textarea name="texto" class="textarea form-control" cols="40" rows="10" required="True"></textarea>
</div>
</div> </div>
</div> </fieldset>
</fieldset>
<br /><br /><br /> <br /><br /><br />
<fieldset> <fieldset>
<legend>2. Selecione as matérias para primeira tramitação:</legend> <legend>2. Selecione as matérias para primeira tramitação:</legend>
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead> <thead>
<tr><th>Matéria</th></tr> <tr><th>Matéria</th></tr>
</thead> </thead>
<tbody> <tbody>
{% for materia in object_list %} {% for materia in object_list %}
<tr> <tr>
<td> <td>
<input type="checkbox" name="materia_id" value="{{materia.id}}" {% if check %} checked {% endif %}/> <input type="checkbox" name="materia_id" value="{{materia.id}}" {% if check %} checked {% endif %}/>
{{materia.tipo.sigla}} {{materia.tipo.descricao}} {{materia.numero}}/{{materia.ano}} {{materia.tipo.sigla}} {{materia.tipo.descricao}} {{materia.numero}}/{{materia.ano}}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</fieldset> </fieldset>
<input type="submit" value="Salvar" class="btn btn-primary"S> <input type="submit" value="Salvar" class="btn btn-primary"S>
</form> </form>
{% else %}
<tr><td><h3 style="text-align: right;">Nenhuma matéria encontrada.</h3></td></tr>
{% endif %}
{% endif %} {% endif %}
{% endblock detail_content %} {% endblock detail_content %}

6
sapl/templates/materia/relatoria_form.html

@ -12,3 +12,9 @@
{% crispy form %} {% crispy form %}
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block extra_js %}
<script language="Javascript">
$("#id_comissao").attr("disabled", true);
</script>
{% endblock extra_js %}

2
sapl/templates/sessao/pauta_sessao_filter.html

@ -24,7 +24,7 @@
{% for s in page_obj %} {% for s in page_obj %}
<tr> <tr>
<td><a href="{% url 'sapl.sessao:pauta_sessao_detail' s.id %}"><strong>{{s}}</strong></br></a></td><td> <td><a href="{% url 'sapl.sessao:pauta_sessao_detail' s.id %}"><strong>{{s}}</strong></br></a></td><td>
<a href="{% url 'sapl.relatorios:relatorio_sessao_plenaria' s.id %}"><img src="{% static 'img/file.png' %}"></a> <a href="{% url 'sapl.relatorios:relatorio_sessao_plenaria' s.id %}"><img height="30" width="30" src="{% static 'img/pdflogo.png' %}"></a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

3
sapl/test_urls.py

@ -5,13 +5,10 @@ from django.contrib.auth.management import _get_all_permissions
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db import transaction from django.db import transaction
from django.utils.translation import string_concat
from django.utils.translation import string_concat
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.translation import string_concat from django.utils.translation import string_concat
from sapl.crud.base import PermissionRequiredForAppCrudMixin from sapl.crud.base import PermissionRequiredForAppCrudMixin
from sapl.materia.views import recuperar_materia
from scripts.inicializa_grupos_autorizacoes import cria_grupos_permissoes from scripts.inicializa_grupos_autorizacoes import cria_grupos_permissoes
from scripts.lista_urls import lista_urls from scripts.lista_urls import lista_urls

20
sapl/utils.py

@ -1,10 +1,14 @@
import hashlib
import logging
from datetime import date from datetime import date
from functools import wraps from functools import wraps
from unicodedata import normalize as unicodedata_normalize from unicodedata import normalize as unicodedata_normalize
import hashlib import hashlib
import logging import logging
import re import re
import magic
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Button from crispy_forms.layout import HTML, Button
from django import forms from django import forms
@ -19,12 +23,12 @@ from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import PermissionDenied, ValidationError from django.core.exceptions import PermissionDenied, ValidationError
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from floppyforms import ClearableFileInput from floppyforms import ClearableFileInput
import magic import magic
from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row
from sapl.settings import BASE_DIR from sapl.settings import BASE_DIR
sapl_logger = logging.getLogger(BASE_DIR.name) sapl_logger = logging.getLogger(BASE_DIR.name)
@ -131,8 +135,10 @@ class SaplGenericRelation(GenericRelation):
) )
[ref_1]: https://docs.djangoproject.com/el/1.10/topics/db/queries/#field-lookups [ref_1]: https://docs.djangoproject.com/el/1.10/topics/db/queries/
[ref_2]: https://github.com/interlegis/sapl/blob/master/sapl/parlamentares/models.py #field-lookups
[ref_2]: https://github.com/interlegis/sapl/blob/master/sapl/
parlamentares/models.py
""" """
def __init__(self, to, fields_search=(), **kwargs): def __init__(self, to, fields_search=(), **kwargs):
@ -146,7 +152,7 @@ class SaplGenericRelation(GenericRelation):
for field in fields_search: for field in fields_search:
# descomente para ver todas os campos que são elementos de busca # descomente para ver todas os campos que são elementos de busca
#print(kwargs['related_query_name'], field) # print(kwargs['related_query_name'], field)
assert isinstance(field, (tuple, list)), _( assert isinstance(field, (tuple, list)), _(
'fields_search deve ser um array de tuplas ou listas.') 'fields_search deve ser um array de tuplas ou listas.')
@ -496,16 +502,16 @@ def models_with_gr_for_model(model):
def generic_relations_for_model(model): def generic_relations_for_model(model):
""" """
Esta função retorna uma lista de tuplas de dois elementos, onde o primeiro Esta função retorna uma lista de tuplas de dois elementos, onde o primeiro
elemento é um model qualquer que implementa SaplGenericRelation (SGR), o elemento é um model qualquer que implementa SaplGenericRelation (SGR), o
segundo elemento é uma lista de todas as SGR's que pode haver dentro do segundo elemento é uma lista de todas as SGR's que pode haver dentro do
model retornado na primeira posição da tupla. model retornado na primeira posição da tupla.
Exemplo: No Sapl, o model Parlamentar tem apenas uma SGR para Autor. Exemplo: No Sapl, o model Parlamentar tem apenas uma SGR para Autor.
Se no Sapl existisse apenas essa SGR, o resultado dessa função Se no Sapl existisse apenas essa SGR, o resultado dessa função
seria: seria:
[ #Uma Lista de tuplas [ #Uma Lista de tuplas
( # cada tupla com dois elementos ( # cada tupla com dois elementos
sapl.parlamentares.models.Parlamentar, sapl.parlamentares.models.Parlamentar,
[<sapl.utils.SaplGenericRelation: autor>] [<sapl.utils.SaplGenericRelation: autor>]
), ),
] ]

1
scripts/inicializa_grupos_autorizacoes.py

@ -10,7 +10,6 @@ if True:
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group, Permission from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from sapl.base.models import Autor
class InicializaGruposAutorizacoes(): class InicializaGruposAutorizacoes():

Loading…
Cancel
Save