diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 27b1250af..423c94303 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -461,11 +461,17 @@ class TramitacaoForm(ModelForm): 'unidade_tramitacao_destino', 'data_encaminhamento', 'data_fim_prazo', - 'texto'] + 'texto', + 'user', + 'ip'] + widgets = {'user': forms.HiddenInput(), + 'ip': forms.HiddenInput()} def __init__(self, *args, **kwargs): super(TramitacaoForm, self).__init__(*args, **kwargs) self.fields['data_tramitacao'].initial = timezone.now().date() + self.fields['user'].initial = kwargs['initial']['user'] + self.fields['ip'].initial = kwargs['initial']['ip'] ust = UnidadeTramitacao.objects.select_related().all() unidade_tramitacao_destino = [('', '---------')] + [(ut.pk, ut) for ut in ust if ut.comissao and ut.comissao.ativa] @@ -556,6 +562,8 @@ class TramitacaoForm(ModelForm): tramitacao_nova.pk = None tramitacao_nova.materia = ma tramitacao_nova.save() + tramitacao.ip = self.fields['ip'].initial + tramitacao.user = self.fields['user'].initial return tramitacao @@ -580,11 +588,15 @@ class TramitacaoUpdateForm(TramitacaoForm): 'data_encaminhamento', 'data_fim_prazo', 'texto', + 'user', + 'ip' ] widgets = { 'data_encaminhamento': forms.DateInput(format='%d/%m/%Y'), 'data_fim_prazo': forms.DateInput(format='%d/%m/%Y'), + 'user': forms.HiddenInput(), + 'ip': forms.HiddenInput() } def clean(self): diff --git a/sapl/materia/migrations/0046_auto_20190417_1212.py b/sapl/materia/migrations/0046_auto_20190417_1212.py new file mode 100644 index 000000000..397114479 --- /dev/null +++ b/sapl/materia/migrations/0046_auto_20190417_1212.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-04-17 15:12 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('materia', '0045_auto_20190415_1050'), + ] + + operations = [ + migrations.AddField( + model_name='tramitacao', + name='ip', + field=models.CharField(blank=True, default='', max_length=30, verbose_name='IP'), + ), + migrations.AddField( + model_name='tramitacao', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Usuário'), + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index db535e406..aad491b01 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -18,7 +18,7 @@ from sapl.parlamentares.models import Parlamentar #from sapl.protocoloadm.models import Protocolo from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SaplGenericForeignKey, SaplGenericRelation, restringe_tipos_de_arquivo_txt, - texto_upload_path) + texto_upload_path, get_settings_auth_user_model) EM_TRAMITACAO = [(1, 'Sim'), @@ -1003,6 +1003,15 @@ class Tramitacao(models.Model): texto = models.TextField(verbose_name=_('Texto da Ação')) data_fim_prazo = models.DateField( blank=True, null=True, verbose_name=_('Data Fim Prazo')) + user = models.ForeignKey(get_settings_auth_user_model(), + verbose_name=_('Usuário'), + on_delete=models.PROTECT, + null=True, + blank=True) + ip = models.CharField(verbose_name=_('IP'), + max_length=30, + blank=True, + default='') class Meta: verbose_name = _('Tramitação') diff --git a/sapl/materia/views.py b/sapl/materia/views.py index e7a730c8f..9f7ca66ae 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -53,7 +53,7 @@ from sapl.parlamentares.models import Legislatura from sapl.protocoloadm.models import Protocolo from sapl.settings import MEDIA_ROOT from sapl.utils import (YES_NO_CHOICES, autor_label, autor_modal, SEPARADOR_HASH_PROPOSICAO, - gerar_hash_arquivo, get_base_url, + gerar_hash_arquivo, get_base_url, get_client_ip, get_mime_type_from_file_extension, montar_row_autor, show_results_filter_set, mail_service_configured) @@ -1189,6 +1189,8 @@ class TramitacaoCrud(MasterDetailCrud): else: initial['unidade_tramitacao_local'] = '' initial['data_tramitacao'] = timezone.now().date() + initial['ip'] = get_client_ip(self.request) + initial['user'] = self.request.user return initial def get_context_data(self, **kwargs): @@ -1220,6 +1222,8 @@ class TramitacaoCrud(MasterDetailCrud): self.object = form.save() username = self.request.user.username + form.instance.user = self.request.user + form.instance.ip = get_client_ip(self.request) if form.instance.status.indicador == 'F': form.instance.materia.em_tramitacao = False @@ -1234,7 +1238,6 @@ class TramitacaoCrud(MasterDetailCrud): post=self.object, request=self.request) except Exception as e: - # TODO log error msg = _('Tramitação criada, mas e-mail de acompanhamento ' 'de matéria não enviado. Há problemas na configuração ' 'do e-mail.') @@ -1251,6 +1254,12 @@ class TramitacaoCrud(MasterDetailCrud): layout_key = 'TramitacaoUpdate' + def get_initial(self): + initial = super(UpdateView, self).get_initial() + initial['ip'] = get_client_ip(self.request) + initial['user'] = self.request.user + return initial + def form_valid(self, form): self.object = form.save() username = self.request.user.username @@ -2273,6 +2282,8 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): messages.add_message(request, messages.ERROR, msg) return self.get(request, self.kwargs) + user = request.user + ip = get_client_ip(request) t = Tramitacao( materia=materia, data_tramitacao=data_tramitacao, @@ -2285,7 +2296,9 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): urgente=urgente, status_id=request.POST['status'], turno=request.POST['turno'], - texto=request.POST['texto'] + texto=request.POST['texto'], + user=user, + ip=ip ) t.save() try: