diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 000000000..8d64c275c
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,36 @@
+
+
+## Comportamento Esperado
+
+
+
+## Comportamento Atual
+
+
+
+## Possível Solução
+
+
+
+## Passos para Reproduzir (para bugs)
+
+
+1.
+2.
+3.
+4.
+
+## Contexto
+
+
+
+## Imagens do Ocorrido
+
+
+* 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):
\ No newline at end of file
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 000000000..d30dcf3e1
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,37 @@
+
+
+## Descrição
+
+
+## _Issue_ Relacionada
+
+
+
+
+
+## Motivação e Contexto
+
+
+## Como Isso Foi Testado?
+
+
+
+
+## Capturas de Tela (se apropriado):
+
+
+## Tipos de Mudanças
+
+- [ ] _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:
+
+
+- [ ] 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.
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index 540062354..a409b525b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.110
+ image: interlegis/sapl:3.1.112
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/docs/CODE_OF_CONDUCT.md b/docs/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..d78064f5f
--- /dev/null
+++ b/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 http://contributor-covenant.org/version/1/4.
\ No newline at end of file
diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md
new file mode 100644
index 000000000..89b8a8969
--- /dev/null
+++ b/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).
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index 4f01d55f2..6719aec5c 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -17,7 +17,7 @@ from django.utils.translation import string_concat
from sapl.base.models import Autor, TipoAutor
from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column,
to_row)
-from sapl.materia.models import MateriaLegislativa
+from sapl.materia.models import (MateriaLegislativa, UnidadeTramitacao, StatusTramitacao)
from sapl.parlamentares.models import SessaoLegislativa
from sapl.sessao.models import SessaoPlenaria
from sapl.settings import MAX_IMAGE_UPLOAD_SIZE
@@ -671,14 +671,23 @@ class RelatorioMateriasTramitacaoilterSet(django_filters.FilterSet):
label='Ano da Matéria',
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
def qs(self):
parent = super(RelatorioMateriasTramitacaoilterSet, self).qs
return parent.distinct().order_by('-ano', 'tipo', '-numero')
+
class Meta:
model = MateriaLegislativa
- fields = ['ano', 'tipo', 'tramitacao__unidade_tramitacao_local',
+ fields = ['ano', 'tipo', 'tramitacao__unidade_tramitacao_destino',
'tramitacao__status']
def __init__(self, *args, **kwargs):
@@ -689,7 +698,7 @@ class RelatorioMateriasTramitacaoilterSet(django_filters.FilterSet):
row1 = to_row([('ano', 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)])
self.form.helper = FormHelper()
@@ -840,6 +849,7 @@ class ConfiguracoesAppForm(ModelForm):
model = AppConfig
fields = ['documentos_administrativos',
'sequencia_numeracao',
+ 'esfera_federacao',
# 'painel_aberto', # TODO: a ser implementado na versão 3.2
'texto_articulado_proposicao',
'texto_articulado_materia',
diff --git a/sapl/base/migrations/0021_appconfig_esfera_federacao.py b/sapl/base/migrations/0021_appconfig_esfera_federacao.py
new file mode 100644
index 000000000..a13e312cf
--- /dev/null
+++ b/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'),
+ ),
+ ]
diff --git a/sapl/base/models.py b/sapl/base/models.py
index 01bfe9fe2..9dc18d4f7 100644
--- a/sapl/base/models.py
+++ b/sapl/base/models.py
@@ -3,9 +3,11 @@ from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models.signals import post_migrate
from django.db.utils import DEFAULT_DB_ALIAS
+
import reversion
from sapl.translation import ugettext_lazy as _
+
from sapl.utils import (LISTA_DE_UFS, YES_NO_CHOICES,
get_settings_auth_user_model, models_with_gr_for_model)
@@ -17,6 +19,11 @@ SEQUENCIA_NUMERACAO = (('A', _('Sequencial por ano')),
('L', _('Sequencial por legislatura')),
('U', _('Sequencial único')))
+ESFERA_FEDERACAO_CHOICES = (('M', _('Municipal')),
+ ('E', _('Estadual')),
+ ('F', _('Federal')),
+ )
+
@reversion.register()
class CasaLegislativa(models.Model):
@@ -100,6 +107,13 @@ class AppConfig(models.Model):
verbose_name=_('Sequência de numeração'),
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
# painel_aberto = models.BooleanField(
# verbose_name=_('Painel aberto para usuário anônimo'),
diff --git a/sapl/base/views.py b/sapl/base/views.py
index 9d825a483..6abba7db7 100644
--- a/sapl/base/views.py
+++ b/sapl/base/views.py
@@ -45,6 +45,17 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm,
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():
return CasaLegislativa.objects.first()
@@ -425,8 +436,15 @@ class RelatorioMateriasTramitacaoView(FilterView):
context['title'] = _('Matérias em Tramitação')
+ qr = self.request.GET.copy()
qs = context['object_list']
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
qtdes = {}
@@ -437,7 +455,6 @@ class RelatorioMateriasTramitacaoView(FilterView):
qtdes[tipo] = qtde
context['qtdes'] = qtdes
- qr = self.request.GET.copy()
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
context['show_results'] = show_results_filter_set(qr)
diff --git a/sapl/materia/models.py b/sapl/materia/models.py
index 24f240124..a53ce6174 100644
--- a/sapl/materia/models.py
+++ b/sapl/materia/models.py
@@ -262,9 +262,13 @@ class MateriaLegislativa(models.Model):
from sapl.protocoloadm.models import Protocolo
if self.ano and self.numero_protocolo:
try:
- return Protocolo.objects.get(
- ano=self.ano,
- numero=self.numero_protocolo).data
+ protocolo = Protocolo.objects.get(
+ ano=self.ano,
+ numero=self.numero_protocolo)
+ if protocolo.timestamp:
+ return protocolo.timestamp.date()
+ else:
+ return protocolo.data
except ObjectDoesNotExist:
pass
diff --git a/sapl/norma/models.py b/sapl/norma/models.py
index 39749538b..dd5d70741 100644
--- a/sapl/norma/models.py
+++ b/sapl/norma/models.py
@@ -147,7 +147,8 @@ class NormaJuridica(models.Model):
return anexos
def __str__(self):
- return _('nº %(numero)s de %(data)s') % {
+ return _('%(tipo)s nº %(numero)s de %(data)s') % {
+ 'tipo': self.tipo,
'numero': self.numero,
'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")}
diff --git a/sapl/norma/views.py b/sapl/norma/views.py
index d764ca513..85ac8ddbf 100644
--- a/sapl/norma/views.py
+++ b/sapl/norma/views.py
@@ -13,7 +13,7 @@ from django.views.generic.base import RedirectView
from django.views.generic.edit import FormView
from django_filters.views import FilterView
import weasyprint
-
+import sapl
from sapl.base.models import AppConfig
from sapl.compilacao.views import IntegracaoTaView
from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux,
@@ -196,6 +196,16 @@ class NormaCrud(Crud):
def cancel_url(self):
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'
class ListView(Crud.ListView, RedirectView):
diff --git a/sapl/templates/base/layouts.yaml b/sapl/templates/base/layouts.yaml
index 7ed6b032f..4968245fb 100644
--- a/sapl/templates/base/layouts.yaml
+++ b/sapl/templates/base/layouts.yaml
@@ -18,6 +18,9 @@ AppConfig:
{% trans 'Configurações da Aplicação' %}:
- documentos_administrativos
+ {% trans 'Norma Jurídica' %}:
+ - esfera_federacao
+
{% trans 'Proposições e Protocolo' %}:
- sequencia_numeracao proposicao_incorporacao_obrigatoria receber_recibo_proposicao
diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html
index 8046bd9b4..0e66cba3a 100644
--- a/sapl/templates/materia/materialegislativa_filter.html
+++ b/sapl/templates/materia/materialegislativa_filter.html
@@ -57,7 +57,7 @@
{% endif %}
{% if m.numero_protocolo %}
- Protocolo: {{m.numero_protocolo}}/{{m.ano}} Data Entrada: {{m.data_entrada_protocolo}}
+ Protocolo: {{m.numero_protocolo}}/{{m.ano}} Data Entrada: {{m.data_entrada_protocolo|default_if_none:"" }}
{% endif %}
{% if m.autoria_set.all %}
diff --git a/setup.py b/setup.py
index 98b9bce00..392f152d5 100644
--- a/setup.py
+++ b/setup.py
@@ -49,7 +49,7 @@ install_requires = [
]
setup(
name='interlegis-sapl',
- version='3.1.110',
+ version='3.1.112',
packages=find_packages(),
include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',