diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 17ae1a309..5a01ffc30 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -582,7 +582,8 @@ class TramitacaoForm(ModelForm): texto=tramitacao.texto, data_fim_prazo=tramitacao.data_fim_prazo, user=tramitacao.user, - ip=tramitacao.ip + ip=tramitacao.ip, + ultima_edicao=tramitacao.ultima_edicao )) Tramitacao.objects.bulk_create(lista_tramitacao) @@ -624,14 +625,16 @@ class TramitacaoUpdateForm(TramitacaoForm): 'data_fim_prazo', 'texto', 'user', - 'ip' + 'ip', + 'ultima_edicao' ] widgets = { 'data_encaminhamento': forms.DateInput(format='%d/%m/%Y'), 'data_fim_prazo': forms.DateInput(format='%d/%m/%Y'), 'user': forms.HiddenInput(), - 'ip': forms.HiddenInput() + 'ip': forms.HiddenInput(), + 'ultima_edicao': forms.HiddenInput() } def clean(self): @@ -662,6 +665,17 @@ class TramitacaoUpdateForm(TramitacaoForm): 'Você não pode mudar a Unidade de Destino desta ' 'tramitação, pois irá conflitar com a Unidade ' 'Local da tramitação seguinte') + + if not (cd['data_tramitacao'] != obj.data_tramitacao or \ + cd['unidade_tramitacao_destino'] != obj.unidade_tramitacao_destino or \ + cd['status'] != obj.status or cd['texto'] != obj.texto or \ + cd['data_encaminhamento'] != obj.data_encaminhamento or \ + cd['data_fim_prazo'] != obj.data_fim_prazo or cd['urgente'] != str(obj.urgente) or \ + cd['turno'] != obj.turno): + ### Se não ocorreram alterações, o usuário, ip, data e hora da última edição (real) são mantidos + cd['user'] = obj.user + cd['ip'] = obj.ip + cd['ultima_edicao'] = obj.ultima_edicao cd['data_tramitacao'] = obj.data_tramitacao cd['unidade_tramitacao_local'] = obj.unidade_tramitacao_local @@ -694,6 +708,7 @@ class TramitacaoUpdateForm(TramitacaoForm): tram_anexada.data_fim_prazo = nova_tram_principal.data_fim_prazo tram_anexada.user = nova_tram_principal.user tram_anexada.ip = nova_tram_principal.ip + tram_anexada.ultima_edicao = nova_tram_principal.ultima_edicao tram_anexada.save() ma.em_tramitacao = False if nova_tram_principal.status.indicador == "F" else True @@ -1618,9 +1633,13 @@ class TramitacaoEmLoteForm(ModelForm): 'data_fim_prazo', 'texto', 'user', - 'ip'] + 'ip', + 'ultima_edicao'] + widgets = {'user': forms.HiddenInput(), - 'ip': forms.HiddenInput()} + 'ip': forms.HiddenInput(), + 'ultima_edicao': forms.HiddenInput()} + def __init__(self, *args, **kwargs): super(TramitacaoEmLoteForm, self).__init__(*args, **kwargs) @@ -1741,9 +1760,12 @@ class TramitacaoEmLoteForm(ModelForm): @transaction.atomic def save(self, commit=True): cd = self.cleaned_data + materias = self.initial['materias'] user = self.initial['user'] if 'user' in self.initial else None ip = self.initial['ip'] if 'ip' in self.initial else '' + ultima_edicao = self.initial['ultima_edicao'] if 'ultima_edicao' in self.initial else '' + tramitar_anexadas = AppConfig.attr('tramitacao_materia') for mat_id in materias: mat = MateriaLegislativa.objects.get(id=mat_id) @@ -1759,7 +1781,8 @@ class TramitacaoEmLoteForm(ModelForm): texto=cd['texto'], data_fim_prazo=cd['data_fim_prazo'], user=user, - ip=ip + ip=ip, + ultima_edicao=ultima_edicao ) mat.em_tramitacao = False if tramitacao.status.indicador == "F" else True mat.save() @@ -1785,7 +1808,8 @@ class TramitacaoEmLoteForm(ModelForm): texto=tramitacao.texto, data_fim_prazo=tramitacao.data_fim_prazo, user=tramitacao.user, - ip=tramitacao.ip + ip=tramitacao.ip, + ultima_edicao=tramitacao.ultima_edicao )) Tramitacao.objects.bulk_create(lista_tramitacao) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 001816012..9ac9512be 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1313,32 +1313,20 @@ class TramitacaoCrud(MasterDetailCrud): layout_key = 'TramitacaoUpdate' - def form_valid(self, form): - dict_objeto_antigo = Tramitacao.objects.get( - pk=self.kwargs['pk']).__dict__ - - self.object = form.save() - dict_objeto_novo = self.object.__dict__ - - user = self.request.user + def get_initial(self): + initial = super(UpdateView, self).get_initial() + + initial['ip'] = get_client_ip(self.request) + initial['user'] = self.request.user - atributos = [ - 'data_tramitacao', 'unidade_tramitacao_destino_id', 'status_id', 'texto', - 'data_encaminhamento', 'data_fim_prazo', 'urgente', 'turno' - ] + tz = timezone.get_current_timezone() + initial['ultima_edicao'] = tz.localize(datetime.now()) - # Se não houve qualquer alteração em um dos dados, mantém o usuário - # e ip e data e hora de última edição - for atributo in atributos: - if dict_objeto_antigo[atributo] != dict_objeto_novo[atributo]: - self.object.user = user - self.object.ip = get_client_ip(self.request) + return initial - tz = timezone.get_current_timezone() - self.object.ultima_edicao = tz.localize(datetime.now()) - - self.object.save() - break + def form_valid(self, form): + self.object = form.save() + user = self.request.user try: self.logger.debug("user=" + user.username + ". Tentando enviar Tramitacao (sender={}, post={}, request={}" @@ -2414,6 +2402,9 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): def post(self, request, *args, **kwargs): user = request.user ip = get_client_ip(request) + + tz = timezone.get_current_timezone() + ultima_edicao = tz.localize(datetime.now()) materias_ids = request.POST.getlist('materias') if not materias_ids: @@ -2423,7 +2414,8 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): form = TramitacaoEmLoteForm(request.POST, initial= {'materias': materias_ids, - 'user': user, 'ip':ip}) + 'user': user, 'ip':ip, + 'ultima_edicao': ultima_edicao}) if form.is_valid(): form.save()