Browse Source

Tramitacao em Lote

pull/2773/head
Cesar Carvalho 7 years ago
parent
commit
5829235f8a
  1. 45
      sapl/protocoloadm/forms.py
  2. 7
      sapl/protocoloadm/urls.py
  3. 219
      sapl/protocoloadm/views.py
  4. 1
      sapl/templates/navbar.yaml
  5. 2
      sapl/templates/protocoloadm/em_lote/subnav_em_lote.yaml

45
sapl/protocoloadm/forms.py

@ -1538,15 +1538,12 @@ class PrimeiraTramitacaoEmLoteAdmForm(ModelForm):
if 'data_tramitacao' in cleaned_data: if 'data_tramitacao' in cleaned_data:
data_tram_form = cleaned_data['data_tramitacao'] data_tram_form = cleaned_data['data_tramitacao']
if not self.is_valid():
return cleaned_data
if not self.instance.data_tramitacao: if not self.instance.data_tramitacao:
if self.cleaned_data['data_tramitacao'] > timezone.now().date(): if cleaned_data['data_tramitacao'] > timezone.now().date():
self.logger.error('A data de tramitação ({}) deve ser ' self.logger.error('A data de tramitação ({}) deve ser '
'menor ou igual a data de hoje ({})!' 'menor ou igual a data de hoje ({})!'
.format(self.cleaned_data['data_tramitacao'], timezone.now().date())) .format(cleaned_data['data_tramitacao'], timezone.now().date()))
msg = _( msg = _(
'A data de tramitação deve ser ' + 'A data de tramitação deve ser ' +
'menor ou igual a data de hoje!') 'menor ou igual a data de hoje!')
@ -1570,7 +1567,7 @@ class PrimeiraTramitacaoEmLoteAdmForm(ModelForm):
'maior que a data de tramitação!') 'maior que a data de tramitação!')
raise ValidationError(msg) raise ValidationError(msg)
return self.cleaned_data return cleaned_data
@transaction.atomic @transaction.atomic
def save(self, commit=True): def save(self, commit=True):
@ -1617,4 +1614,38 @@ class PrimeiraTramitacaoEmLoteAdmForm(ModelForm):
)) ))
TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao) TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao)
return tramitacao return tramitacao
class TramitacaoEmLoteAdmFilterSet(django_filters.FilterSet):
class Meta(FilterOverridesMetaMixin):
model = DocumentoAdministrativo
fields = ['tipo', 'data', 'tramitacaoadministrativo__status',
'tramitacaoadministrativo__unidade_tramitacao_destino']
def __init__(self, *args, **kwargs):
super(TramitacaoEmLoteAdmFilterSet, self).__init__(
*args, **kwargs)
self.filters['tipo'].label = _('Tipo de Documento')
self.filters['data'].label = _('Data (Inicial - Final)')
self.filters['tramitacaoadministrativo__unidade_tramitacao_destino'
].label = _('Unidade Destino (Último Destino)')
self.filters['tramitacaoadministrativo__status'].label = _('Status')
self.form.fields['tipo'].required = True
self.form.fields['data'].required = False
self.form.fields['tramitacaoadministrativo__status'].required = True
self.form.fields[
'tramitacaoadministrativo__unidade_tramitacao_destino'].required = True
row1 = to_row([
('tipo', 4),
('tramitacaoadministrativo__unidade_tramitacao_destino', 4),
('tramitacaoadministrativo__status', 4)])
row2 = to_row([('data', 12)])
self.form.helper = SaplFormHelper()
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Tramitação em Lote'),
row1, row2, form_actions(label=_('Pesquisar'))))

7
sapl/protocoloadm/urls.py

@ -23,7 +23,8 @@ from sapl.protocoloadm.views import (AcompanhamentoDocumentoView,
DesvincularDocumentoView, DesvincularDocumentoView,
DesvincularMateriaView, DesvincularMateriaView,
AnexadoCrud, DocumentoAnexadoEmLoteView, AnexadoCrud, DocumentoAnexadoEmLoteView,
PrimeiraTramitacaoEmLoteAdmView) PrimeiraTramitacaoEmLoteAdmView,
TramitacaoEmLoteAdmView)
from .apps import AppConfig from .apps import AppConfig
@ -103,8 +104,8 @@ urlpatterns_protocolo = [
PrimeiraTramitacaoEmLoteAdmView.as_view(), PrimeiraTramitacaoEmLoteAdmView.as_view(),
name='primeira_tramitacao_em_lote_docadm'), name='primeira_tramitacao_em_lote_docadm'),
# url(r'^protocoloadm/tramitacao-em-lote', TramitacaoEmLoteAdmView.as_view(), url(r'^protocoloadm/tramitacao-em-lote', TramitacaoEmLoteAdmView.as_view(),
# name='tramitacao_em_lote_docadm'), name='tramitacao_em_lote_docadm'),
] ]

219
sapl/protocoloadm/views.py

@ -29,7 +29,7 @@ from sapl.base.signals import tramitacao_signal
from sapl.comissoes.models import Comissao from sapl.comissoes.models import Comissao
from sapl.crud.base import (Crud, CrudAux, MasterDetailCrud, make_pagination, from sapl.crud.base import (Crud, CrudAux, MasterDetailCrud, make_pagination,
RP_LIST, RP_DETAIL) RP_LIST, RP_DETAIL)
from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa, UnidadeTramitacao
from sapl.materia.views import gerar_pdf_impressos from sapl.materia.views import gerar_pdf_impressos
from sapl.parlamentares.models import Legislatura, Parlamentar from sapl.parlamentares.models import Legislatura, Parlamentar
from sapl.protocoloadm.models import Protocolo from sapl.protocoloadm.models import Protocolo
@ -49,6 +49,7 @@ from .forms import (AcompanhamentoDocumentoForm, AnularProtocoloAdmForm,
AnexadoForm, AnexadoEmLoteFilterSet, AnexadoForm, AnexadoEmLoteFilterSet,
PrimeiraTramitacaoEmLoteAdmFilterSet, PrimeiraTramitacaoEmLoteAdmFilterSet,
PrimeiraTramitacaoEmLoteAdmForm, PrimeiraTramitacaoEmLoteAdmForm,
TramitacaoEmLoteAdmFilterSet,
compara_tramitacoes_doc) compara_tramitacoes_doc)
from .models import (AcompanhamentoDocumento, DocumentoAcessorioAdministrativo, from .models import (AcompanhamentoDocumento, DocumentoAcessorioAdministrativo,
DocumentoAdministrativo, StatusTramitacaoAdministrativo, DocumentoAdministrativo, StatusTramitacaoAdministrativo,
@ -1451,12 +1452,13 @@ class FichaSelecionaAdmView(PermissionRequiredMixin, FormView):
class PrimeiraTramitacaoEmLoteAdmView(PermissionRequiredMixin, FilterView): class PrimeiraTramitacaoEmLoteAdmView(PermissionRequiredMixin, FilterView):
filterset_class = PrimeiraTramitacaoEmLoteAdmFilterSet filterset_class = PrimeiraTramitacaoEmLoteAdmFilterSet
template_name = 'protocoloadm/em_lote/tramitacaoadm.html' template_name = 'protocoloadm/em_lote/tramitacaoadm.html'
permission_required = ('materia.add_tramitacao', ) permission_required = ('documento.add_tramitacao', )
primeira_tramitacao = True primeira_tramitacao = True
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(PrimeiraTramitacaoEmLoteAdmView, context = super(PrimeiraTramitacaoEmLoteAdmView,
self).get_context_data(**kwargs) self).get_context_data(**kwargs)
@ -1470,6 +1472,10 @@ class PrimeiraTramitacaoEmLoteAdmView(PermissionRequiredMixin, FilterView):
context['object_list'] = context['object_list'].order_by( context['object_list'] = context['object_list'].order_by(
'ano', 'numero') 'ano', 'numero')
qr = self.request.GET.copy()
form = PrimeiraTramitacaoEmLoteAdmForm()
context['form'] = form
if self.primeira_tramitacao: if self.primeira_tramitacao:
context['title'] = _('Primeira Tramitação em Lote') context['title'] = _('Primeira Tramitação em Lote')
@ -1478,13 +1484,8 @@ class PrimeiraTramitacaoEmLoteAdmView(PermissionRequiredMixin, FilterView):
if obj.tramitacaoadministrativo_set.all().count() == 0] if obj.tramitacaoadministrativo_set.all().count() == 0]
else: else:
context['title'] = _('Tramitação em Lote') context['title'] = _('Tramitação em Lote')
# context['unidade_local'] = [UnidadeTramitacao.objects.get( context['form'].fields['unidade_tramitacao_local'].initial = UnidadeTramitacao.objects.get(
# id=qr['tramitacao__unidade_tramitacao_destino'])] id=qr['tramitacaoadministrativo__unidade_tramitacao_destino'])
qr = self.request.GET.copy()
form = PrimeiraTramitacaoEmLoteAdmForm()
context['form'] = form
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
@ -1492,11 +1493,6 @@ class PrimeiraTramitacaoEmLoteAdmView(PermissionRequiredMixin, FilterView):
return context return context
def form_invalid(self, form):
for key, erro in form.errors.items():
messages.add_message(self.request, messages.ERROR, form.fields[key].label + ": " + erro[0])
return self.get(self.request, self.kwargs)
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
user = request.user user = request.user
ip = get_client_ip(request) ip = get_client_ip(request)
@ -1512,134 +1508,81 @@ class PrimeiraTramitacaoEmLoteAdmView(PermissionRequiredMixin, FilterView):
'user': user, 'ip':ip}) 'user': user, 'ip':ip})
if form.is_valid(): if form.is_valid():
cd = form.clean() # cd = form.clean()
form.save() form.save()
msg = _('Tramitação completa.') msg = _('Tramitação completa.')
self.logger.info('user=' + user.username + '. Tramitação completa.') self.logger.info('user=' + user.username + '. Tramitação completa.')
messages.add_message(request, messages.SUCCESS, msg) messages.add_message(request, messages.SUCCESS, msg)
return self.get(request, self.kwargs) return self.get_success_url()
else: return self.form_invalid(form)
# self.object_list = DocumentoAdministrativo.objects.filter(id__in=documentos_ids)
# import ipdb; ipdb.set_trace()
# context = self.get_context_data(**kwargs)
return self.form_invalid(form)
# messages.add_message(request, messages.ERROR, form.errors)
def get_success_url(self):
# import ipdb; ipdb.set_trace() return HttpResponseRedirect(reverse('sapl.protocoloadm:primeira_tramitacao_em_lote_docadm'))
# marcadas = request.POST.getlist('materia_id')
# tz = timezone.get_current_timezone() def form_invalid(self, form, *args, **kwargs):
for key, erros in form.errors.items():
# username = request.user.username if not key=='__all__':
[messages.add_message(self.request, messages.ERROR, form.fields[key].label + ": " + e) for e in erros]
# if len(marcadas) == 0: else:
# msg = _('Nenhuma máteria foi selecionada.') [messages.add_message(self.request, messages.ERROR, e) for e in erros]
# messages.add_message(request, messages.ERROR, msg) return self.get(self.request, kwargs, {'form':form})
# return self.get(request, self.kwargs)
# obrigatorios = {'data_tramitacao': 'Data da Tramitação',
# 'unidade_tramitacao_local': 'Unidade Local', class TramitacaoEmLoteAdmView(PrimeiraTramitacaoEmLoteAdmView):
# 'unidade_tramitacao_destino': 'Unidade Destino', filterset_class = TramitacaoEmLoteAdmFilterSet
# 'status': 'Status',
# 'urgente': 'Urgente', primeira_tramitacao = False
# 'texto': 'Texto da Ação'}
# for field, nome in obrigatorios.items(): def get_context_data(self, **kwargs):
# if not request.POST[field]: context = super(TramitacaoEmLoteAdmView,
# msg = _('Campo {} deve ser preenchido.'.format(nome)) self).get_context_data(**kwargs)
# messages.add_message(request, messages.ERROR, msg)
# return self.get(request, self.kwargs) qr = self.request.GET.copy()
# if not request.POST['data_encaminhamento']: context['primeira_tramitacao'] = False
# data_encaminhamento = None
# else: if ('tramitacao__status' in qr and
# try: 'tramitacao__unidade_tramitacao_destino' in qr and
# data_encaminhamento = tz.localize(datetime.strptime( qr['tramitacao__status'] and
# request.POST['data_encaminhamento'], "%d/%m/%Y")) qr['tramitacao__unidade_tramitacao_destino']):
# except ValueError: lista = self.filtra_tramitacao_destino_and_status(
# msg = _('Formato da data de encaminhamento incorreto.') qr['tramitacao__status'],
# messages.add_message(request, messages.ERROR, msg) qr['tramitacao__unidade_tramitacao_destino'])
# return self.get(request, self.kwargs) context['object_list'] = context['object_list'].filter(
id__in=lista).distinct()
# if request.POST['data_fim_prazo'] == '':
# data_fim_prazo = None return context
# else:
# try:
# data_fim_prazo = tz.localize(datetime.strptime( def pega_ultima_tramitacao(self):
# request.POST['data_fim_prazo'], "%d/%m/%Y")) return TramitacaoAdministrativo.objects.values(
# except ValueError: 'documento_id').annotate(data_encaminhamento=Max(
# msg = _('Formato da data fim do prazo incorreto.') 'data_encaminhamento'),
# messages.add_message(request, messages.ERROR, msg) id=Max('id')).values_list('id', flat=True)
# return self.get(request, self.kwargs)
def filtra_tramitacao_status(self, status):
# # issue https://github.com/interlegis/sapl/issues/1123 lista = self.pega_ultima_tramitacao()
# # TODO: usar Form return TramitacaoAdministrativo.objects.filter(
# urgente = request.POST['urgente'] == 'True' id__in=lista,
# flag_error = False status=status).distinct().values_list('documento_id', flat=True)
# materias_principais = [m for m in MateriaLegislativa.objects.filter(id__in=marcadas)]
# materias_anexadas = [m.anexadas.all() for m in MateriaLegislativa.objects.filter(id__in=marcadas) if m.anexadas.all()] def filtra_tramitacao_destino(self, destino):
# import ipdb; ipdb.set_trace() lista = self.pega_ultima_tramitacao()
# materias_anexadas = list(itertools.chain.from_iterable(materias_anexadas)) return TramitacaoAdministrativo.objects.filter(
# tramitacao_local = int(request.POST['unidade_tramitacao_local']) id__in=lista,
# materias_anexadas = list(filter(lambda ma : not ma.tramitacao_set.all() or \ unidade_tramitacao_destino=destino).distinct().values_list(
# ma.tramitacao_set.last().unidade_tramitacao_destino.id == tramitacao_local, 'documento_id', flat=True)
# materias_anexadas))
# materias = set(materias_principais + materias_anexadas)
def filtra_tramitacao_destino_and_status(self, status, destino):
# for materia in materias: lista = self.pega_ultima_tramitacao()
# try: return TramitacaoAdministrativo.objects.filter(
# data_tramitacao = tz.localize(datetime.strptime( id__in=lista,
# request.POST['data_tramitacao'], "%d/%m/%Y")) status=status,
# except ValueError: unidade_tramitacao_destino=destino).distinct().values_list(
# msg = _('Formato da data da tramitação incorreto.') 'documento_id', flat=True)
# 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,
# data_encaminhamento=data_encaminhamento,
# data_fim_prazo=data_fim_prazo,
# unidade_tramitacao_local_id=request.POST[
# 'unidade_tramitacao_local'],
# unidade_tramitacao_destino_id=request.POST[
# 'unidade_tramitacao_destino'],
# urgente=urgente,
# status_id=request.POST['status'],
# turno=request.POST['turno'],
# texto=request.POST['texto'],
# user=user,
# ip=ip
# )
# t.save()
# try:
# self.logger.debug("user=" + username +
# ". Tentando enviar tramitação.")
# tramitacao_signal.send(sender=Tramitacao,
# post=t,
# request=self.request)
# except Exception as e:
# self.logger.error('user=' + username + '. Tramitação criada , mas e-mail de acompanhamento '
# 'de matéria não enviado. Há problemas na configuração '
# 'do e-mail. ' + str(e))
# flag_error = True
# if flag_error:
# msg = _('Tramitação criada, mas e-mail de acompanhamento '
# 'de matéria não enviado. A não configuração do servidor de e-mail '
# 'impede o envio de aviso de tramitação')
# messages.add_message(self.request, messages.WARNING, msg)
# status = StatusTramitacao.objects.get(id=request.POST['status'])
# for materia in materias:
# if status.indicador == 'F':
# materia.em_tramitacao = False
# elif self.primeira_tramitacao:
# materia.em_tramitacao = True
# materia.save()

1
sapl/templates/navbar.yaml

@ -35,6 +35,7 @@
url: sapl.protocoloadm:pesq_doc_adm url: sapl.protocoloadm:pesq_doc_adm
- title: {% trans 'Tramitação em Lote' %} - title: {% trans 'Tramitação em Lote' %}
url: sapl.protocoloadm:primeira_tramitacao_em_lote_docadm url: sapl.protocoloadm:primeira_tramitacao_em_lote_docadm
check_permission: sapl.documento:add_tramitacao
- title: {% trans 'Atividade Legislativa' %} - title: {% trans 'Atividade Legislativa' %}
children: children:

2
sapl/templates/protocoloadm/em_lote/subnav_em_lote.yaml

@ -2,4 +2,4 @@
- title: {% trans 'Primeira Tramitação' %} - title: {% trans 'Primeira Tramitação' %}
url: primeira_tramitacao_em_lote_docadm url: primeira_tramitacao_em_lote_docadm
- title: {% trans 'Tramitação em Lote' %} - title: {% trans 'Tramitação em Lote' %}
url: primeira_tramitacao_em_lote_docadm url: tramitacao_em_lote_docadm

Loading…
Cancel
Save