Browse Source

Merge branch '3.1.x' into cria-expressao-textual

pull/2169/head
Leandro Roberto 7 years ago
parent
commit
d3b1560dd2
  1. 36
      .github/ISSUE_TEMPLATE.md
  2. 37
      .github/PULL_REQUEST_TEMPLATE.md
  3. 2
      docker-compose.yml
  4. 40
      docs/CODE_OF_CONDUCT.md
  5. 24
      docs/CONTRIBUTING.md
  6. 16
      sapl/base/forms.py
  7. 20
      sapl/base/migrations/0021_appconfig_esfera_federacao.py
  8. 14
      sapl/base/models.py
  9. 19
      sapl/base/views.py
  10. 8
      sapl/materia/models.py
  11. 3
      sapl/norma/models.py
  12. 12
      sapl/norma/views.py
  13. 3
      sapl/templates/base/layouts.yaml
  14. 2
      sapl/templates/materia/materialegislativa_filter.html
  15. 2
      setup.py

36
.github/ISSUE_TEMPLATE.md

@ -0,0 +1,36 @@
<!--- Forneça um resumo geral da _issue_ no título acima -->
## Comportamento Esperado
<!--- Se você está descrevendo um _bug_, conte-nos o que deveria acontecer. -->
<!--- Se você está sugerindo uma mudança/melhoria, conte-nos como deve funcionar. -->
## Comportamento Atual
<!--- Se está descrevendo um bug, conte-nos o que acontece em vez do comportamento esperado. -->
<!--- Se está sugerindo uma mudança/melhoria, explique a diferença com o comportamento atual. -->
## Possível Solução
<!--- Não é obrigatório, mas sugira uma possível correção/razão para o bug -->
<!--- ou ideias de como implementar a adição/mudança. -->
## Passos para Reproduzir (para bugs)
<!--- Forneça um link para um exemplo, ou um conjunto de passos inequívocos -->
<!--- para reproduzir esse bug. Inclua código para reproduzir, se relevante. -->
1.
2.
3.
4.
## Contexto
<!--- Como esse problema o afeta? O que você está tentando realizar? -->
<!--- Fornecer o contexto nos ajuda a encontrar uma solução que seja mais útil no mundo real -->
## Imagens do Ocorrido
<!--- Representação visual em vídeo ou imagem do ocorrido -->
<!--- Se está descrevendo um bug poste imagens ou vídeos na repordução do bug citado, caso se aplique --:
## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
* Versão usada (_Release_):
* Nome e versão do navegador:
* Nome e versão do Sistema Operacional (desktop ou mobile):
* Link para o seu projeto (Caso de fork deste projeto):

37
.github/PULL_REQUEST_TEMPLATE.md

@ -0,0 +1,37 @@
<!--- Forneça um resumo geral das suas alterações no título acima -->
## Descrição
<!--- Decreva suas alterações detalhadamente -->
## _Issue_ Relacionada
<!--- Este projeto apenas aceita _pull requests_ relacionadas à _issues_ abertas. -->
<!--- Se está sugerindo uma nova _feature_ ou mudança, por favor discuta em uma _issue_ antes. -->
<!--- Se está corrigindo um _bug_, deve haver uma _issue_ descrevendo-o com passos para reproduzir. -->
<!--- Por favor, adicione o link para a _issue_ aqui: -->
## Motivação e Contexto
<!--- Por que essa mudança é necessária? Qual problema ela resolve? -->
## Como Isso Foi Testado?
<!--- Por favor, descreva detalhadamente como você testou suas mudanças. -->
<!--- Inclua detalhes do seu ambiente de teste e os testes que você executou -->
<!--- para ver como a sua alteração afeta outras áreas do código, etc. -->
## Capturas de Tela (se apropriado):
<!--- Insera imagens, se apropriado, da adição e/ou correção que foi feita -->
## Tipos de Mudanças
<!--- Quais os tipos de alterações introduzidos pelo seu código? Coloque um `x` em todas as caixas que se aplicam: -->
- [ ] _Bug fix_ (alteração que corrige uma _issue_ e não altera funcionalidades já existentes)
- [ ] Nova _feature_ (alteração que adiciona uma funcionalidade e não altera funcionalidades já existentes)
- [ ] Alteração disruptiva (_Breaking change_) (Correção ou funcionalidade que causa alteração nas funcionalidades existentes)
## Checklist:
<!--- Passe por todos os pontos a seguir e coloque um `x` em todas as caixas que se aplicam. -->
<!--- Se você não tem certeza sobre nenhum destes, não hesite em perguntar. Nós estamos aqui para ajudar! -->
- [ ] Eu li o documento de Contribuição (**CONTRIBUTING**).
- [ ] Meu código segue o estilo de código desse projeto.
- [ ] Minha alteração requer uma alteração na documentação.
- [ ] Eu atualizei a documentação de acordo.
- [ ] Eu adicionei testes para cobrir minhas mudanças.
- [ ] Todos os testes novos e existentes passaram.

2
docker-compose.yml

@ -11,7 +11,7 @@ sapldb:
ports: ports:
- "5432:5432" - "5432:5432"
sapl: sapl:
image: interlegis/sapl:3.1.110 image: interlegis/sapl:3.1.112
restart: always restart: always
environment: environment:
ADMIN_PASSWORD: interlegis ADMIN_PASSWORD: interlegis

40
docs/CODE_OF_CONDUCT.md

@ -0,0 +1,40 @@
# Código de Conduta do Convênio de Contribuição
## Nosso Compromisso
No interesse de promover um ambiente aberto e acolhedor, nós, como colaboradores e mantenedores, prometemos fazer parte de nosso projeto e de nossa comunidade uma experiência livre de assédio para todos, independentemente da idade, tamanho corporal, deficiência, etnia, identidade e expressão de gênero, nível de experiência, nacionalidade, aparência pessoal, raça, religião ou identidade e orientação sexual.
## Nossos Padrões
Exemplos de comportamentos que contribuem para criar um ambiente positivo incluem:
- Uso linguagem acolhedora e inclusiva.
- Ser respeitoso com diferentes pontos de vista e experiências.
- Aceitar críticas construtivas.
- Concentrar no que é melhor para a comunidade.
- Mostrar empatia para com outros membros da comunidade.
Exemplos de comportamentos inaceitáveis dos contribuidores incluem:
- O uso de linguagem ou imagens sexualizadas e avanços ou assédios sexuais indesejáveis.
- Comentários depreciativos, insultos/derrogatórios e ataques pessoais ou políticos.
- Assédio público ou em privado.
- Publicar a informação privada dos outros, como um endereço físico ou eletrônico, sem permissão explícita.
- Outra conduta que razoavelmente pode ser considerada inapropriada em um ambiente profissional.
## Nossas Responsabilidades
Os responsáveis ​​pelo projeto são responsáveis ​​por esclarecer os padrões de comportamento aceitável e devem tomar medidas corretivas apropriadas e justas em resposta a qualquer instância de comportamento inaceitável.
Os mantenedores do projeto têm o direito e a responsabilidade de remover, editar ou rejeitar comentários, compromissos, códigos, edições de wiki, problemas e outras contribuições que não estejam alinhados com este Código de Conduta ou proibir temporariamente ou permanentemente qualquer contribuinte para outros comportamentos que eles consideram inapropriado, ameaçador, ofensivo ou prejudicial.
## Escopo
Este Código de Conduta aplica-se tanto nos espaços do projeto quanto nos espaços públicos quando um indivíduo representa o projeto ou sua comunidade. Exemplos de representar um projeto ou comunidade incluem o uso de um endereço de e-mail oficial do projeto, postagem através de uma conta oficial em mídias sociais, ou atuando como representante designado em um evento online ou offline. A representação de um projeto pode ser melhor definida e esclarecida pelos responsáveis ​​pelo projeto.
## Execução
Instâncias de comportamento abusivo, de assédio ou de outra forma inaceitável podem ser comunicadas ao contactar a equipe do projeto através do COLAB do Interlegis para o projeto do SAPL, todas as informações podem ser acessadas através [deste link](https://colab.interlegis.leg.br/wiki/ProjetoSapl).
A equipe do projeto irá rever e investigar todas as queixas, e responderá da forma que julgar apropriada às circunstâncias.
A equipe do projeto buscará manter a confidencialidade em relação ao repórter de um incidente. Mais detalhes sobre políticas de execução específicas podem ser publicados separadamente.
Os mantenedores do projeto que não seguem ou aplicam o Código de Conduta de boa fé podem enfrentar repercussões temporárias ou permanentes, conforme determinado por outros membros da liderança do projeto.
## Atribuição
Este Código de Conduta é adaptado da Convenção do Contribuinte, versão 1.4, disponível em <a>http://contributor-covenant.org/version/1/4</a>.

24
docs/CONTRIBUTING.md

@ -0,0 +1,24 @@
# Contribuindo com SAPL
Caso queira contribuir com o projeto, talvez seja uma boa ideia começar pelo [README](https://github.com/interlegis/sapl) para conhecer melhor sobre nós.
Outro documento importante e que deve ser lido é o [Código de Conduta](https://github.com/interlegis/sapl/blob/3.1.x/docs/CODE_OF_CONDUCT.md).
Obrigado por contribuir! :tada::+1: Sua ajuda será recebida com muita gratidão!
# Como eu posso contribuir?
## Reportando um Bug
* Esse projeto segue um padrão de [_Issues_](https://github.com/interlegis/sapl/blob/3.1.x/.github/ISSUE_TEMPLATE.md). Logo, caso encontre um bug, verifique se ele não se encontra em uma das nossas _Issues_. Os bugs devem ser marcados com _tag (label)_ __bug__.
* Se o bug encontrado não consta nas _Issues_, basta abrir uma [Nova _Issue_](https://github.com/interlegis/sapl/issues/new).
## Adicionando e/ou modificando alguma funcionalidade
* Primeiro verifique que não existe nenhuma [_Issue_](https://github.com/interlegis/sapl/issues) a respeito dessa modificação e/ou adição.
* Caso não exista, crie uma [Nova _Issue_](https://github.com/interlegis/sapl/issues/new). Dê um título significativo a ela, coloque uma descrição e pelo menos uma _label_.
* As mudanças devem ser submetidas através de [_Pull Requests_](https://github.com/interlegis/sapl/compare). Você pode encontrar mais sobre isso no [_Pull Requests Template_](https://github.com/interlegis/sapl/blob/3.1.x/.github/PULL_REQUEST_TEMPLATE.md).

16
sapl/base/forms.py

@ -17,7 +17,7 @@ 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,
to_row) to_row)
from sapl.materia.models import MateriaLegislativa from sapl.materia.models import (MateriaLegislativa, UnidadeTramitacao, StatusTramitacao)
from sapl.parlamentares.models import SessaoLegislativa from sapl.parlamentares.models import SessaoLegislativa
from sapl.sessao.models import SessaoPlenaria from sapl.sessao.models import SessaoPlenaria
from sapl.settings import MAX_IMAGE_UPLOAD_SIZE from sapl.settings import MAX_IMAGE_UPLOAD_SIZE
@ -671,14 +671,23 @@ class RelatorioMateriasTramitacaoilterSet(django_filters.FilterSet):
label='Ano da Matéria', label='Ano da Matéria',
choices=RANGE_ANOS) choices=RANGE_ANOS)
tramitacao__unidade_tramitacao_destino = django_filters.ModelChoiceFilter(
queryset=UnidadeTramitacao.objects.all(),
label=_('Unidade Atual'))
tramitacao__status = django_filters.ModelChoiceFilter(
queryset=StatusTramitacao.objects.all(),
label=_('Status Atual'))
@property @property
def qs(self): def qs(self):
parent = super(RelatorioMateriasTramitacaoilterSet, self).qs parent = super(RelatorioMateriasTramitacaoilterSet, self).qs
return parent.distinct().order_by('-ano', 'tipo', '-numero') return parent.distinct().order_by('-ano', 'tipo', '-numero')
class Meta: class Meta:
model = MateriaLegislativa model = MateriaLegislativa
fields = ['ano', 'tipo', 'tramitacao__unidade_tramitacao_local', fields = ['ano', 'tipo', 'tramitacao__unidade_tramitacao_destino',
'tramitacao__status'] 'tramitacao__status']
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -689,7 +698,7 @@ class RelatorioMateriasTramitacaoilterSet(django_filters.FilterSet):
row1 = to_row([('ano', 12)]) row1 = to_row([('ano', 12)])
row2 = to_row([('tipo', 12)]) row2 = to_row([('tipo', 12)])
row3 = to_row([('tramitacao__unidade_tramitacao_local', 12)]) row3 = to_row([('tramitacao__unidade_tramitacao_destino', 12)])
row4 = to_row([('tramitacao__status', 12)]) row4 = to_row([('tramitacao__status', 12)])
self.form.helper = FormHelper() self.form.helper = FormHelper()
@ -840,6 +849,7 @@ class ConfiguracoesAppForm(ModelForm):
model = AppConfig model = AppConfig
fields = ['documentos_administrativos', fields = ['documentos_administrativos',
'sequencia_numeracao', 'sequencia_numeracao',
'esfera_federacao',
# 'painel_aberto', # TODO: a ser implementado na versão 3.2 # 'painel_aberto', # TODO: a ser implementado na versão 3.2
'texto_articulado_proposicao', 'texto_articulado_proposicao',
'texto_articulado_materia', 'texto_articulado_materia',

20
sapl/base/migrations/0021_appconfig_esfera_federacao.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.13 on 2018-08-28 18:16
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('base', '0020_auto_20180821_1421'),
]
operations = [
migrations.AddField(
model_name='appconfig',
name='esfera_federacao',
field=models.CharField(blank=True, choices=[('M', 'Municipal'), ('E', 'Estadual'), ('F', 'Federal')], default='', max_length=1, verbose_name='Esfera Federação'),
),
]

14
sapl/base/models.py

@ -3,9 +3,11 @@ from django.contrib.contenttypes.models import ContentType
from django.db import models from django.db import models
from django.db.models.signals import post_migrate from django.db.models.signals import post_migrate
from django.db.utils import DEFAULT_DB_ALIAS from django.db.utils import DEFAULT_DB_ALIAS
import reversion import reversion
from sapl.translation import ugettext_lazy as _ from sapl.translation import ugettext_lazy as _
from sapl.utils import (LISTA_DE_UFS, YES_NO_CHOICES, from sapl.utils import (LISTA_DE_UFS, YES_NO_CHOICES,
get_settings_auth_user_model, models_with_gr_for_model) get_settings_auth_user_model, models_with_gr_for_model)
@ -17,6 +19,11 @@ SEQUENCIA_NUMERACAO = (('A', _('Sequencial por ano')),
('L', _('Sequencial por legislatura')), ('L', _('Sequencial por legislatura')),
('U', _('Sequencial único'))) ('U', _('Sequencial único')))
ESFERA_FEDERACAO_CHOICES = (('M', _('Municipal')),
('E', _('Estadual')),
('F', _('Federal')),
)
@reversion.register() @reversion.register()
class CasaLegislativa(models.Model): class CasaLegislativa(models.Model):
@ -100,6 +107,13 @@ class AppConfig(models.Model):
verbose_name=_('Sequência de numeração'), verbose_name=_('Sequência de numeração'),
choices=SEQUENCIA_NUMERACAO, default='A') choices=SEQUENCIA_NUMERACAO, default='A')
esfera_federacao = models.CharField(
max_length=1,
blank=True,
default="",
verbose_name=_('Esfera Federação'),
choices=ESFERA_FEDERACAO_CHOICES)
# TODO: a ser implementado na versão 3.2 # TODO: a ser implementado na versão 3.2
# painel_aberto = models.BooleanField( # painel_aberto = models.BooleanField(
# verbose_name=_('Painel aberto para usuário anônimo'), # verbose_name=_('Painel aberto para usuário anônimo'),

19
sapl/base/views.py

@ -45,6 +45,17 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm,
from .models import AppConfig, CasaLegislativa from .models import AppConfig, CasaLegislativa
def filtra_url_materias_em_tramitacao(qr, qs, campo_url, local_ou_status):
id_materias = []
filtro_url = qr[campo_url]
if local_ou_status == 'local':
id_materias = [item.id for item in qs if item.tramitacao_set.order_by('-id').first().unidade_tramitacao_destino_id == int(filtro_url)]
elif local_ou_status == 'status':
id_materias = [item.id for item in qs if item.tramitacao_set.order_by('-id').first().status_id == int(filtro_url)]
return qs.filter(em_tramitacao=True, id__in=id_materias)
def get_casalegislativa(): def get_casalegislativa():
return CasaLegislativa.objects.first() return CasaLegislativa.objects.first()
@ -425,8 +436,15 @@ class RelatorioMateriasTramitacaoView(FilterView):
context['title'] = _('Matérias em Tramitação') context['title'] = _('Matérias em Tramitação')
qr = self.request.GET.copy()
qs = context['object_list'] qs = context['object_list']
qs = qs.filter(em_tramitacao=True) qs = qs.filter(em_tramitacao=True)
if qr.get('tramitacao__unidade_tramitacao_destino'):
qs = filtra_url_materias_em_tramitacao(qr, qs, 'tramitacao__unidade_tramitacao_destino', 'local')
if qr.get('tramitacao__status'):
qs = filtra_url_materias_em_tramitacao(qr, qs, 'tramitacao__status', 'status')
context['object_list'] = qs context['object_list'] = qs
qtdes = {} qtdes = {}
@ -437,7 +455,6 @@ class RelatorioMateriasTramitacaoView(FilterView):
qtdes[tipo] = qtde qtdes[tipo] = qtde
context['qtdes'] = qtdes context['qtdes'] = qtdes
qr = self.request.GET.copy()
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
context['show_results'] = show_results_filter_set(qr) context['show_results'] = show_results_filter_set(qr)

8
sapl/materia/models.py

@ -262,9 +262,13 @@ class MateriaLegislativa(models.Model):
from sapl.protocoloadm.models import Protocolo from sapl.protocoloadm.models import Protocolo
if self.ano and self.numero_protocolo: if self.ano and self.numero_protocolo:
try: try:
return Protocolo.objects.get( protocolo = Protocolo.objects.get(
ano=self.ano, ano=self.ano,
numero=self.numero_protocolo).data numero=self.numero_protocolo)
if protocolo.timestamp:
return protocolo.timestamp.date()
else:
return protocolo.data
except ObjectDoesNotExist: except ObjectDoesNotExist:
pass pass

3
sapl/norma/models.py

@ -147,7 +147,8 @@ class NormaJuridica(models.Model):
return anexos return anexos
def __str__(self): def __str__(self):
return _('%(numero)s de %(data)s') % { return _('%(tipo)s%(numero)s de %(data)s') % {
'tipo': self.tipo,
'numero': self.numero, 'numero': self.numero,
'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")} 'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")}

12
sapl/norma/views.py

@ -13,7 +13,7 @@ from django.views.generic.base import RedirectView
from django.views.generic.edit import FormView from django.views.generic.edit import FormView
from django_filters.views import FilterView from django_filters.views import FilterView
import weasyprint import weasyprint
import sapl
from sapl.base.models import AppConfig from sapl.base.models import AppConfig
from sapl.compilacao.views import IntegracaoTaView from sapl.compilacao.views import IntegracaoTaView
from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux,
@ -196,6 +196,16 @@ class NormaCrud(Crud):
def cancel_url(self): def cancel_url(self):
return self.search_url return self.search_url
def get_initial(self):
try:
esfera = sapl.base.models.AppConfig.objects.last(
).esfera_federacao
self.initial['esfera_federacao'] = esfera
except:
pass
self.initial['complemento'] = False
return self.initial
layout_key = 'NormaJuridicaCreate' layout_key = 'NormaJuridicaCreate'
class ListView(Crud.ListView, RedirectView): class ListView(Crud.ListView, RedirectView):

3
sapl/templates/base/layouts.yaml

@ -18,6 +18,9 @@ AppConfig:
{% trans 'Configurações da Aplicação' %}: {% trans 'Configurações da Aplicação' %}:
- documentos_administrativos - documentos_administrativos
{% trans 'Norma Jurídica' %}:
- esfera_federacao
{% trans 'Proposições e Protocolo' %}: {% trans 'Proposições e Protocolo' %}:
- sequencia_numeracao proposicao_incorporacao_obrigatoria receber_recibo_proposicao - sequencia_numeracao proposicao_incorporacao_obrigatoria receber_recibo_proposicao

2
sapl/templates/materia/materialegislativa_filter.html

@ -57,7 +57,7 @@
</br> </br>
{% endif %} {% endif %}
{% if m.numero_protocolo %} {% if m.numero_protocolo %}
<strong>Protocolo: </strong>{{m.numero_protocolo}}/{{m.ano}} &nbsp;&nbsp; <strong>Data Entrada:</strong> {{m.data_entrada_protocolo}} </br> <strong>Protocolo: </strong>{{m.numero_protocolo}}/{{m.ano}} &nbsp;&nbsp; <strong>Data Entrada:</strong> {{m.data_entrada_protocolo|default_if_none:"" }} </br>
{% endif %} {% endif %}
{% if m.autoria_set.all %} {% if m.autoria_set.all %}

2
setup.py

@ -49,7 +49,7 @@ install_requires = [
] ]
setup( setup(
name='interlegis-sapl', name='interlegis-sapl',
version='3.1.110', version='3.1.112',
packages=find_packages(), packages=find_packages(),
include_package_data=True, include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',

Loading…
Cancel
Save