diff --git a/docker-compose.yml b/docker-compose.yml
index f721b66f0..55a6b2359 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.76
+ image: interlegis/sapl:3.1.77
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/release.sh b/release.sh
index 78fee9187..437355e57 100755
--- a/release.sh
+++ b/release.sh
@@ -6,14 +6,40 @@ MAIN_REV=`echo $VERSION | cut -f 1,2 -d '.'`
NEXT_NUMBER=$(($LAST_DIGIT + 1))
NEXT_VERSION=$MAIN_REV'.'$NEXT_NUMBER
-sed -e s/$VERSION/$NEXT_VERSION/g docker-compose.yml > tmp1
-mv tmp1 docker-compose.yml
-sed -e s/$VERSION/$NEXT_VERSION/g setup.py > tmp2
-mv tmp2 setup.py
+function bump_version {
+ sed -e s/$VERSION/$NEXT_VERSION/g docker-compose.yml > tmp1
+ mv tmp1 docker-compose.yml
+
+ sed -e s/$VERSION/$NEXT_VERSION/g setup.py > tmp2
+ mv tmp2 setup.py
+}
+
+function commit_and_push {
+ echo "committing..."
+ git add docker-compose.yml setup.py
+ git commit -m "Release: $NEXT_VERSION"
+ git tag $NEXT_VERSION
+
+ echo "sending to github..."
+ git push origin $NEXT_VERSION
+ git push origin
+
+ echo "done."
+}
+
+case "$1" in
+ --dryrun)
+ echo "Dry run"
+ bump_version
+ echo "done."
+ echo "Run git checkout -- docker-compose.yml setup.py to undo the files"
+
+ exit 0
+ ;;
+ --a)
+ echo "generating release"
+ bump_version
+ commit_and_push
+esac
-git add docker-compose.yml setup.py
-git commit -m "Release: $NEXT_VERSION"
-git tag $NEXT_VERSION
-git push origin $NEXT_VERSION
-git push origin
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index e083e7fec..e5ff928d7 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -36,7 +36,7 @@ from sapl.materia.models import (AssuntoMateria, Autoria, MateriaAssunto,
from sapl.norma.models import (LegislacaoCitada, NormaJuridica,
TipoNormaJuridica)
from sapl.parlamentares.models import Legislatura
-from sapl.protocoloadm.models import Protocolo
+from sapl.protocoloadm.models import Protocolo, DocumentoAdministrativo
from sapl.settings import MAX_DOC_UPLOAD_SIZE
from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES,
ChoiceWithoutValidationField,
@@ -182,19 +182,39 @@ class MateriaLegislativaForm(ModelForm):
data_apresentacao = cleaned_data['data_apresentacao']
ano = cleaned_data['ano']
+ protocolo = cleaned_data['numero_protocolo']
+ protocolo_antigo = self.instance.numero_protocolo
+
+ if protocolo:
+ if not Protocolo.objects.filter(numero=protocolo,ano=ano).exists():
+ raise ValidationError(_('Protocolo %s/%s não'
+ ' existe' % (protocolo, ano)))
+
+ if protocolo_antigo != protocolo:
+ exist_materia = MateriaLegislativa.objects.filter(
+ numero_protocolo=protocolo,
+ ano=ano).exists()
+
+ exist_doc = DocumentoAdministrativo.objects.filter(
+ protocolo_id=protocolo,
+ ano=ano).exists()
+ if exist_materia or exist_doc:
+ raise ValidationError(_('Protocolo %s/%s ja possui'
+ ' documento vinculado'
+ % (protocolo, ano)))
if data_apresentacao.year != ano:
- raise ValidationError("O ano da matéria não pode ser "
- "diferente do ano na data de apresentação")
+ raise ValidationError(_("O ano da matéria não pode ser "
+ "diferente do ano na data de apresentação"))
ano_origem_externa = cleaned_data['ano_origem_externa']
data_origem_externa = cleaned_data['data_origem_externa']
if ano_origem_externa and data_origem_externa and \
ano_origem_externa != data_origem_externa.year:
- raise ValidationError("O ano de origem externa da matéria não "
+ raise ValidationError(_("O ano de origem externa da matéria não "
"pode ser diferente do ano na data de "
- "origem externa")
+ "origem externa"))
return cleaned_data
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
index a23932b42..74f2bd6b6 100644
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -937,7 +937,8 @@ class RelatoriaCrud(MasterDetailCrud):
except ObjectDoesNotExist:
pass
else:
- composicao = comissao.composicao_set.last()
+ composicao = comissao.composicao_set.order_by(
+ '-periodo__data_inicio').first()
participacao = Participacao.objects.filter(
composicao=composicao)
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index 06a2f7854..e85e9ecf2 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -698,6 +698,22 @@ class DocumentoAdministrativoForm(ModelForm):
numero_protocolo, ano_protocolo))
raise ValidationError(msg)
+ inst = self.instance.protocolo
+ protocolo_antigo = inst.numero if inst else None
+
+ if str(protocolo_antigo) != numero_protocolo:
+ exist_materia = MateriaLegislativa.objects.filter(
+ numero_protocolo=numero_protocolo,
+ ano=ano_protocolo).exists()
+
+ exist_doc = DocumentoAdministrativo.objects.filter(
+ protocolo_id=numero_protocolo,
+ ano=ano_protocolo).exists()
+ if exist_materia or exist_doc:
+ raise ValidationError(_('Protocolo %s/%s ja possui'
+ ' documento vinculado'
+ % (numero_protocolo, ano_protocolo)))
+
return self.cleaned_data
def save(self, commit=True):
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
index 746bbfec1..db3875677 100644
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -4,7 +4,7 @@ from operator import itemgetter
from django.contrib import messages
from django.contrib.auth.decorators import permission_required
from django.contrib.auth.mixins import PermissionRequiredMixin
-from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
+from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse
from django.db.models import Max, Q
from django.forms.utils import ErrorList
@@ -990,8 +990,8 @@ class MesaView(FormMixin, DetailView):
set(
[p.parlamentar for p in parlamentares]) - set(
parlamentares_ocupados))
-
- org_parlamentares_vagos = sorted(parlamentares_vagos, key=lambda x: x.nome_parlamentar)
+ org_parlamentares_vagos = parlamentares_vagos
+ org_parlamentares_vagos.sort(key=lambda x: remover_acentos(x.nome_parlamentar))
org_parlamentares_vagos = [p for p in org_parlamentares_vagos if p.ativo]
# Se todos os cargos estiverem ocupados, a listagem de parlamentares
# deve ser renderizada vazia
@@ -1046,8 +1046,10 @@ def atualizar_mesa(request):
lista_composicao = [(c.id, c.parlamentar.__str__(),
c.cargo.__str__()) for c in composicao_mesa]
lista_parlamentares = [(
- p.id, p.__str__()) for p in parlamentares_vagos]
+ p.id, p.nome_parlamentar)
+ for p in parlamentares_vagos if p.ativo]
lista_cargos = [(c.id, c.__str__()) for c in cargos_vagos]
+ lista_parlamentares.sort(key=lambda x: remover_acentos(x[1]))
return JsonResponse(
{'lista_composicao': lista_composicao,
diff --git a/sapl/templates/norma/subnav.yaml b/sapl/templates/norma/subnav.yaml
index d050a469f..a89326fd7 100644
--- a/sapl/templates/norma/subnav.yaml
+++ b/sapl/templates/norma/subnav.yaml
@@ -4,7 +4,7 @@
url: normajuridica_detail
- title: {% trans 'Alterações em Outras Normas' %}
url: normarelacionada_list
- check_permission: norma.normarelacionada_list
+ check_permission: norma.list_normarelacionada
# Opção adicionada para chamar o TextoArticulado da norma.
# para integração foram necessárias apenas criar a url norma_ta em urls.py
diff --git a/sapl/templates/sessao/mesa.html b/sapl/templates/sessao/mesa.html
index 02f313656..56e7f9989 100644
--- a/sapl/templates/sessao/mesa.html
+++ b/sapl/templates/sessao/mesa.html
@@ -38,7 +38,7 @@
diff --git a/sapl/utils.py b/sapl/utils.py
index 8045f0e0b..69ea53dfc 100644
--- a/sapl/utils.py
+++ b/sapl/utils.py
@@ -735,5 +735,4 @@ def RemoveTag(texto):
return textoSaida
def remover_acentos(string):
- return ''.join([c for c in unicodedata.normalize('NFD', string)
- if unicodedata.category(c) != 'Mn'])
\ No newline at end of file
+ return unicodedata.normalize('NFKD', string).encode('ASCII', 'ignore').decode()
\ No newline at end of file
diff --git a/setup.py b/setup.py
index da929d87c..af5b2c7d2 100644
--- a/setup.py
+++ b/setup.py
@@ -49,7 +49,7 @@ install_requires = [
]
setup(
name='interlegis-sapl',
- version='3.1.76',
+ version='3.1.77',
packages=find_packages(),
include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',