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',