Skip to content

Commit

Permalink
Merge pull request #2154 from prefeiturasp/release/8.4.0
Browse files Browse the repository at this point in the history
Release/8.4.0
  • Loading branch information
alcfernandes authored Jul 2, 2023
2 parents 206e1e4 + 5abfdad commit 20916d5
Show file tree
Hide file tree
Showing 40 changed files with 650 additions and 234 deletions.
60 changes: 30 additions & 30 deletions Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pipeline {
kubeconfig = getKubeconf(env.branchname)
registryCredential = 'jenkins_registry'
}

agent {
node { label 'python-36-ptrf' }
}
Expand All @@ -14,36 +14,36 @@ pipeline {
disableConcurrentBuilds()
skipDefaultCheckout()
}

stages {
stage('CheckOut') {
steps { checkout scm }

stage('CheckOut') {
steps { checkout scm }
}

stage('Preparando BD') {
when { anyOf { branch 'master'; branch 'develop'; branch 'homolog-r2'; branch 'pre-release'; } }
agent { label 'AGENT-NODES' }
when { anyOf { branch 'master'; branch 'develop'; branch 'homolog-r2'; branch 'pre-release'; } }
agent { label 'AGENT-NODES' }
steps {
sh '''
docker run -d --rm --cap-add SYS_TIME --name ptrf-db$BUILD_NUMBER$BRANCH_NAME --network python-network -p 5432 -e TZ="America/Sao_Paulo" -e POSTGRES_DB=ptrf -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres postgres:14-alpine
'''
}
}

stage('Istalando dependencias') {
when { anyOf { branch 'master'; branch 'develop'; branch 'homolog-r2'; branch 'pre-release'; } }
when { anyOf { branch 'master'; branch 'develop'; branch 'homolog-r2'; branch 'pre-release'; } }
agent { label 'AGENT-PYTHON36' }
steps {
checkout scm
sh 'pip install --user pipenv -r requirements/local.txt'
}

}


stage('Testes Lint') {
when { anyOf { branch 'master'; branch 'develop'; branch 'homolog-r2'; branch 'pre-release'; } }
when { anyOf { branch 'master'; branch 'develop'; branch 'homolog-r2'; branch 'pre-release'; } }
agent { label 'AGENT-PYTHON36' }
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
Expand All @@ -60,10 +60,10 @@ pipeline {
recordIssues(tools: [flake8(pattern: 'flake8-output.txt')])
}
}

}
stage('Testes Unitarios') {
when { anyOf { branch 'master'; branch 'develop'; branch 'homolog-r2'; branch 'pre-release'; } }
when { anyOf { branch 'master'; branch 'develop'; branch 'homolog-r2'; branch 'pre-release'; } }
agent { label 'AGENT-PYTHON36' }
steps {
sh '''
Expand All @@ -78,10 +78,10 @@ pipeline {
publishCoverage adapters: [cobertura('coverage.xml')], sourceFileResolver: sourceFiles('NEVER_STORE')
}
}
}
}

stage('AnaliseCodigo') {
when { anyOf { branch 'master'; branch 'develop'; branch 'homolog-r2'; branch 'pre-release'; } }
when { anyOf { branch 'master'; branch 'develop'; branch 'homolog-r2'; branch 'pre-release'; } }
agent { label 'AGENT-PYTHON36' }
steps {
withSonarQubeEnv('sonarqube-local'){
Expand All @@ -92,9 +92,9 @@ pipeline {
}
}


stage('Build') {
when { anyOf { branch 'master'; branch 'main'; branch "story/*"; branch 'develop'; branch 'release'; branch 'homolog'; branch 'homolog-r2'; branch 'pre-release'; } }
when { anyOf { branch 'master'; branch 'main'; branch "story/*"; branch 'develop'; branch 'release'; branch 'homolog'; branch 'homolog-r2'; branch 'pre-release'; } }
steps {
script {
imagename1 = "registry.sme.prefeitura.sp.gov.br/${env.branchname}/ptrf-backend"
Expand All @@ -110,9 +110,9 @@ pipeline {
}
}
}

stage('Deploy'){
when { anyOf { branch 'master'; branch 'main'; branch 'development'; branch 'develop'; branch 'release'; branch 'homolog'; branch 'homolog-r2'; branch 'pre-release'; } }
when { anyOf { branch 'master'; branch 'main'; branch 'development'; branch 'develop'; branch 'release'; branch 'homolog'; branch 'homolog-r2'; branch 'pre-release'; } }
steps {
script{
if ( env.branchname == 'main' || env.branchname == 'master' || env.branchname == 'homolog' || env.branchname == 'release' ) {
Expand All @@ -124,7 +124,7 @@ pipeline {
}
}
withCredentials([file(credentialsId: "${kubeconfig}", variable: 'config')]){

if ( env.branchname == 'homolog-r2' ) {
sh('cp $config '+"$home"+'/.kube/config')
sh 'kubectl rollout restart deployment/ptrf-backend -n sme-ptrf-hom2'
Expand All @@ -146,32 +146,32 @@ pipeline {
}
}
}
}
}


stage('Deploy Ambientes'){
when { anyOf { branch 'master'; branch 'main' } }
parallel {
stage('Deploy Treino'){
stage('Deploy Treino'){
steps {
sh 'kubectl rollout restart deployment/treinamento-backend -n sigescola-treinamento'
sh 'kubectl rollout restart deployment/treinamento-celery -n sigescola-treinamento'
sh 'kubectl rollout restart deployment/treinamento-flower -n sigescola-treinamento'
sh 'kubectl rollout restart deployment/treinamento-flower -n sigescola-treinamento'
}
}

stage('Deploy Treinamento2'){
stage('Deploy Treinamento2'){
steps {
sh 'kubectl rollout restart deployment/treinamento-backend -n sigescola-treinamento2'
sh 'kubectl rollout restart deployment/treinamento-celery -n sigescola-treinamento2'
sh 'kubectl rollout restart deployment/treinamento-flower -n sigescola-treinamento2'
sh 'kubectl rollout restart deployment/treinamento-flower -n sigescola-treinamento2'
}
}

}
}
}
}
}
post {
post {
always{
node('AGENT-NODES'){
//Limpando containers de banco
Expand All @@ -188,6 +188,6 @@ def getKubeconf(branchName) {
else if ("homolog-r2".equals(branchName)) { return "config_hom"; }
else if ("release".equals(branchName)) { return "config_hom"; }
else if ("development".equals(branchName)) { return "config_dev"; }
else if ("develop".equals(branchName)) { return "config_dev"; }
else if ("develop".equals(branchName)) { return "config_dev"; }
else if ("pre-release".equals(branchName)) { return "config_prd"; }
}
2 changes: 1 addition & 1 deletion sme_ptrf_apps/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = "8.3.1"
__version__ = "8.4.0"

__version_info__ = tuple(
[
Expand Down
14 changes: 12 additions & 2 deletions sme_ptrf_apps/core/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -583,12 +583,22 @@ class TipoDevolucaoTesouroAdmin(admin.ModelAdmin):
class ComentarioAnalisePrestacaoAdmin(admin.ModelAdmin):

def get_associacao(self, obj):
return obj.prestacao_conta.associacao.nome if obj and obj.prestacao_conta and obj.prestacao_conta.associacao else ''
if obj.prestacao_conta:
return obj.prestacao_conta.associacao.nome if obj and obj.prestacao_conta.associacao else ''
elif obj.associacao:
return obj.associacao.nome
else:
return ''

get_associacao.short_description = 'Associação'

def get_referencia_periodo(self, obj):
return obj.prestacao_conta.periodo.referencia if obj and obj.prestacao_conta and obj.prestacao_conta.periodo else ''
if obj.prestacao_conta:
return obj.prestacao_conta.periodo.referencia if obj and obj.prestacao_conta.periodo else ''
elif obj.periodo:
return obj.periodo.referencia
else:
return ''

get_referencia_periodo.short_description = 'Período'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from rest_framework.exceptions import APIException
from rest_framework.status import HTTP_400_BAD_REQUEST

from ...models import ComentarioAnalisePrestacao, PrestacaoConta
from ...models import ComentarioAnalisePrestacao, PrestacaoConta, Associacao, Periodo


class CustomError(APIException):
Expand All @@ -18,8 +18,36 @@ class ComentarioAnalisePrestacaoRetrieveSerializer(serializers.ModelSerializer):
prestacao_conta = serializers.SlugRelatedField(
slug_field='uuid',
required=False,
allow_null=True,
queryset=PrestacaoConta.objects.all()
)
associacao = serializers.SlugRelatedField(
slug_field='uuid',
required=False,
allow_null=True,
queryset=Associacao.objects.all()
)
periodo = serializers.SlugRelatedField(
slug_field='uuid',
required=False,
allow_null=True,
queryset=Periodo.objects.all()
)

def validate(self, data):
prestacao_conta = self.initial_data['prestacao_conta'] if 'prestacao_conta' in self.initial_data else None
associacao = self.initial_data['associacao'] if 'associacao' in self.initial_data else None
periodo = self.initial_data['periodo'] if 'periodo' in self.initial_data else None

if self.instance:
if 'prestacao_conta' in self.initial_data or 'associacao' in self.initial_data or 'periodo' in self.initial_data:
if not (prestacao_conta or (associacao and periodo)):
raise CustomError({"detail": "É necessário enviar a prestação de contas ou associação e período."})
else:
if not (prestacao_conta or (associacao and periodo)):
raise CustomError({"detail": "É necessário enviar a prestação de contas ou associação e período."})

return data

def validate_notificado(self, value):
# Validação realizada quando Update é chamado, para Delete será tratado na View, pois validate NÃO é chamado no delete
Expand All @@ -31,4 +59,4 @@ def validate_notificado(self, value):
class Meta:
model = ComentarioAnalisePrestacao
order_by = 'ordem'
fields = ('uuid', 'prestacao_conta', 'ordem', 'comentario', 'notificado', 'notificado_em')
fields = ('uuid', 'prestacao_conta', 'associacao', 'periodo', 'ordem', 'comentario', 'notificado', 'notificado_em')
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django_filters import rest_framework as filters
from django.db.models import Q
from django.core.exceptions import ValidationError
from rest_framework import viewsets
from rest_framework.permissions import AllowAny, IsAuthenticated
Expand All @@ -7,7 +8,7 @@
from rest_framework import status

from sme_ptrf_apps.core.api.serializers import ComentarioAnalisePrestacaoRetrieveSerializer
from sme_ptrf_apps.core.models import ComentarioAnalisePrestacao, PrestacaoConta
from sme_ptrf_apps.core.models import ComentarioAnalisePrestacao, PrestacaoConta, Associacao, Periodo
from sme_ptrf_apps.users.permissoes import PermissaoAPITodosComLeituraOuGravacao


Expand Down Expand Up @@ -42,34 +43,73 @@ def destroy(self, request, *args, **kwargs):
@action(detail=False, url_path='comentarios', methods=['get'],
permission_classes=[IsAuthenticated & PermissaoAPITodosComLeituraOuGravacao])
def comentarios_nao_notificados_e_notificados(self, request):

prestacao_conta_uuid = request.query_params.get('prestacao_conta__uuid')
associacao_uuid = request.query_params.get('associacao_uuid')
periodo_uuid = request.query_params.get('periodo_uuid')

if prestacao_conta_uuid is None:
erro = {
'erro': 'parametros_requerido',
'mensagem': 'É necessário enviar o uuid da prestação de contas.'
}
return Response(erro, status=status.HTTP_400_BAD_REQUEST)
prestacao_de_conta = None
associacao = None
periodo = None

try:
prestacao_de_conta = PrestacaoConta.by_uuid(prestacao_conta_uuid)
except (PrestacaoConta.DoesNotExist, ValidationError):
if not (prestacao_conta_uuid or (associacao_uuid and periodo_uuid)):
erro = {
'erro': 'Objeto não encontrado.',
'mensagem': f"O objeto prestacao_conta para o uuid {prestacao_conta_uuid} não foi encontrado na base."
'erro': 'parametros_requerido',
'mensagem': 'É necessário enviar o uuid da prestação de contas ou o uuid da associação e o uuid do período.'
}
return Response(erro, status=status.HTTP_400_BAD_REQUEST)

comentarios_nao_notificados = ComentarioAnalisePrestacao.objects.filter(
notificado=False,
prestacao_conta=prestacao_de_conta
)

comentarios_notificados = ComentarioAnalisePrestacao.objects.filter(
notificado=True,
prestacao_conta=prestacao_de_conta
).order_by('-notificado_em')
if prestacao_conta_uuid:
try:
prestacao_de_conta = PrestacaoConta.by_uuid(prestacao_conta_uuid)
except (PrestacaoConta.DoesNotExist, ValidationError):
erro = {
'erro': 'Objeto não encontrado.',
'mensagem': f"O objeto prestacao_conta para o uuid {prestacao_conta_uuid} não foi encontrado na base."
}
return Response(erro, status=status.HTTP_400_BAD_REQUEST)

if associacao_uuid and periodo_uuid:
try:
associacao = Associacao.by_uuid(associacao_uuid)
except (Associacao.DoesNotExist, ValidationError):
erro = {
'erro': 'Objeto não encontrado.',
'mensagem': f"O objeto associacao para o uuid {associacao_uuid} não foi encontrado na base."
}
return Response(erro, status=status.HTTP_400_BAD_REQUEST)

try:
periodo = Periodo.by_uuid(periodo_uuid)
except (Periodo.DoesNotExist, ValidationError):
erro = {
'erro': 'Objeto não encontrado.',
'mensagem': f"O objeto periodo para o uuid {periodo_uuid} não foi encontrado na base."
}
return Response(erro, status=status.HTTP_400_BAD_REQUEST)

if prestacao_de_conta:
comentarios_nao_notificados = ComentarioAnalisePrestacao.objects.filter(
notificado=False,
prestacao_conta=prestacao_de_conta
).order_by('ordem')

comentarios_notificados = ComentarioAnalisePrestacao.objects.filter(
notificado=True,
prestacao_conta=prestacao_de_conta
).order_by('-notificado_em')
elif associacao and periodo:
comentarios_nao_notificados = ComentarioAnalisePrestacao.objects.filter(
Q(associacao=associacao) & Q(periodo=periodo),
notificado=False
).order_by('ordem')

comentarios_notificados = ComentarioAnalisePrestacao.objects.filter(
Q(associacao=associacao) & Q(periodo=periodo),
notificado=True,
).order_by('-notificado_em')
else:
comentarios_nao_notificados = list()
comentarios_notificados = list()

result = {
'comentarios_nao_notificados': self.serializer_class(comentarios_nao_notificados, many=True).data,
Expand Down
1 change: 1 addition & 0 deletions sme_ptrf_apps/core/api/views/prestacoes_contas_viewset.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ def concluir(self, request):
usuario=request.user.username,
e_retorno_devolucao=dados["e_retorno_devolucao"],
requer_geracao_documentos=dados["requer_geracao_documentos"],
requer_geracao_fechamentos=dados["requer_geracao_fechamentos"],
justificativa_acertos_pendentes=justificativa_acertos_pendentes,
)
except(IntegrityError):
Expand Down
29 changes: 29 additions & 0 deletions sme_ptrf_apps/core/migrations/0335_auto_20230620_1250.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Generated by Django 3.0.14 on 2023-06-20 12:50

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('core', '0334_auto_20230611_2044'),
]

operations = [
migrations.AddField(
model_name='comentarioanaliseprestacao',
name='associacao',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='comentarios_de_analise_da_associacao', to='core.Associacao'),
),
migrations.AddField(
model_name='comentarioanaliseprestacao',
name='periodo',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='comentarios_de_analise_do_periodo', to='core.Periodo'),
),
migrations.AlterField(
model_name='comentarioanaliseprestacao',
name='prestacao_conta',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='comentarios_de_analise_da_prestacao', to='core.PrestacaoConta'),
),
]
Loading

0 comments on commit 20916d5

Please sign in to comment.