From 2e9ad97256a27b8eb76ba7a5cb3ba47ac4bddb8b Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 3 May 2016 20:10:58 -0300 Subject: [PATCH] =?UTF-8?q?Criar=20Filtro=20em=20N=C3=ADvel=20de=20Notific?= =?UTF-8?q?a=C3=A7=C3=A3o=20de=20Pend=C3=AAncias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compilacao/forms.py | 27 +++- compilacao/urls.py | 4 +- compilacao/views.py | 128 ++++++++++++------ materia/migrations/0031_merge.py | 16 +++ static/styles/compilacao.scss | 2 +- .../layout/bootstrap_btn_checkbox.html | 12 ++ templates/compilacao/text_list.html | 1 + ...pendencias.html => text_notificacoes.html} | 15 +- .../compilacao/textoarticulado_detail.html | 1 + 9 files changed, 155 insertions(+), 51 deletions(-) create mode 100644 materia/migrations/0031_merge.py create mode 100644 templates/compilacao/layout/bootstrap_btn_checkbox.html rename templates/compilacao/{text_pendencias.html => text_notificacoes.html} (88%) diff --git a/compilacao/forms.py b/compilacao/forms.py index 60e943bfe..10aafbdd9 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -4,7 +4,7 @@ from crispy_forms.bootstrap import (Alert, FieldWithButtons, FormActions, InlineRadios, StrictButton) from crispy_forms.helper import FormHelper from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset, - Layout, Row) + Layout, Row, Submit) from django import forms from django.core.exceptions import NON_FIELD_ERRORS, ValidationError from django.db.models import Q @@ -1077,3 +1077,28 @@ class DispositivoEdicaoAlteracaoForm(ModelForm): nd.fim_eficacia = nd.dispositivo_subsequente.inicio_eficacia - \ timedelta(days=1) nd.save() + + +class TextNotificacoesForm(Form): + + type_notificacoes = forms.ChoiceField( + label=_('Níveis de Notificações'), + choices=[('default', _('Mostrar Dispositivos sem Notificações!')), + ('success', _('Informações!')), + ('info', _('Boas Práticas!')), + ('warning', _('Alertas!')), + ('danger', _('Erros!'))], + required=False) + + def __init__(self, *args, **kwargs): + + field_type_notificacoes = to_row([(Field( + 'type_notificacoes', + template="compilacao/layout/bootstrap_btn_checkbox.html"), 10), + (Submit('submit-form', _('Filtrar'), + css_class='btn btn-primary pull-right'), 2)]) + + self.helper = FormHelper() + self.helper.layout = Layout(field_type_notificacoes) + + super(TextNotificacoesForm, self).__init__(*args, **kwargs) diff --git a/compilacao/urls.py b/compilacao/urls.py index 4c8d0ed49..199d02f58 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -27,8 +27,8 @@ urlpatterns_compilacao = [ url(r'^(?P[0-9]+)/text/edit', views.TextEditView.as_view(), name='ta_text_edit'), - url(r'^(?P[0-9]+)/text/pendencias', - views.TextPendenciasView.as_view(), name='ta_text_pendencias'), + url(r'^(?P[0-9]+)/text/notifications', + views.TextNotificacoesView.as_view(), name='ta_text_notificacoes'), url(r'^(?P[0-9]+)/text/(?P[0-9]+)/$', views.DispositivoView.as_view(), name='dispositivo'), diff --git a/compilacao/views.py b/compilacao/views.py index eb55275f5..aba761aa9 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1,6 +1,6 @@ -import sys from collections import OrderedDict from datetime import datetime, timedelta +import sys from braces.views import FormMessagesMixin from django import forms @@ -20,7 +20,7 @@ from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView from django.views.generic.detail import DetailView from django.views.generic.edit import (CreateView, DeleteView, FormView, - UpdateView) + UpdateView, FormMixin) from django.views.generic.list import ListView from compilacao.forms import (DispositivoDefinidorVigenciaForm, @@ -28,7 +28,8 @@ from compilacao.forms import (DispositivoDefinidorVigenciaForm, DispositivoEdicaoBasicaForm, DispositivoEdicaoVigenciaForm, DispositivoSearchModalForm, NotaForm, - PublicacaoForm, TaForm, TipoTaForm, VideForm) + PublicacaoForm, TaForm, TipoTaForm, VideForm, + TextNotificacoesForm) from compilacao.models import (Dispositivo, Nota, PerfilEstruturalTextoArticulado, Publicacao, TextoArticulado, TipoDispositivo, TipoNota, @@ -37,6 +38,7 @@ from compilacao.models import (Dispositivo, Nota, from compilacao.utils import DISPOSITIVO_SELECT_RELATED from crud.base import Crud, CrudListView, make_pagination + TipoNotaCrud = Crud.build(TipoNota, 'tipo_nota') TipoVideCrud = Crud.build(TipoVide, 'tipo_vide') TipoPublicacaoCrud = Crud.build(TipoPublicacao, 'tipo_publicacao') @@ -2294,8 +2296,40 @@ class DispositivoEdicaoAlteracaoView(FormMessagesMixin, UpdateView): return self.form_invalid(form) -class TextPendenciasView(ListView, CompMixin): - template_name = 'compilacao/text_pendencias.html' +class TextNotificacoesView(ListView, CompMixin, FormView): + template_name = 'compilacao/text_notificacoes.html' + form_class = TextNotificacoesForm + + def get(self, request, *args, **kwargs): + self.object = TextoArticulado.objects.get(pk=self.kwargs['ta_id']) + return super(TextNotificacoesView, self).get(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + if 'object' not in kwargs: + kwargs['object'] = self.object + return super(TextNotificacoesView, self).get_context_data(**kwargs) + + def get_success_url(self): + return reverse_lazy('compilacao:ta_text_notificacoes', + kwargs=self.kwargs) + + def get_initial(self): + initial = {} + + if self.request.method == 'POST': + if 'type_notificacoes' in self.request.POST: + self.request.session[ + 'type_notificacoes'] = self.request.POST.getlist( + 'type_notificacoes') + else: + self.request.session['type_notificacoes'] = [] + elif 'type_notificacoes' in self.request.session: + initial['type_notificacoes'] = self.request.session[ + 'type_notificacoes'] + else: + initial['type_notificacoes'] = [] + + return initial def get_queryset(self): @@ -2305,57 +2339,57 @@ class TextPendenciasView(ListView, CompMixin): p = [] - def padd(r, type_pendencia, reverse_url=None, test=True, msg='', + def padd(r, type_notificacao, reverse_url=None, test=True, msg='', kwargs=None, to_position=None): if not test: return - r.contextual_class = type_pendencia + r.contextual_class = type_notificacao if not kwargs: kwargs = {'ta_id': r.ta_id, 'pk': r.pk} if reverse_url: - p.append((type_pendencia, msg, + p.append((type_notificacao, msg, reverse_lazy(reverse_url, kwargs=kwargs), to_position)) else: - p.append((type_pendencia, msg, None, to_position)) + p.append((type_notificacao, msg, None, to_position)) def success(r): - type_pendencia = 'success' - padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + type_notificacao = 'success' + padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia', r.inconstitucionalidade, _('Declarado Inconstitucional.')) - padd(r, type_pendencia, 'compilacao:ta_text_edit', + padd(r, type_notificacao, 'compilacao:ta_text_edit', r.ta_publicado and r.dispositivo_atualizador, _('Dispositivo alterado em %s' % r.ta_publicado), {'ta_id': r.ta_publicado_id}, r.dispositivo_atualizador_id) def info(r): - type_pendencia = 'info' - padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + type_notificacao = 'info' + padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia', r.publicacao and r.dispositivo_vigencia and r.publicacao.data != r.dispositivo_vigencia.inicio_vigencia, _('Data da publicação associada ao Dispositivo difere da data' ' de inicio de vigência do Dispositivo de vigência.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia', r.publicacao and r.publicacao.data != r.inicio_vigencia, _('Data da publicação associada ao Dispositivo difere ' 'da data de inicio de vigência.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit', + padd(r, type_notificacao, 'compilacao:dispositivo_edit', r.rotulo != r.rotulo_padrao(local_insert=1), _('Rótulo Diferente do Padrão')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit', + padd(r, type_notificacao, 'compilacao:dispositivo_edit', r.texto_atualizador and r.texto_atualizador != r.texto, _('Texto do Dispositivo para o Documento ' 'está diferente do texto para o Documento Alterador.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_alteracao', + padd(r, type_notificacao, 'compilacao:dispositivo_edit_alteracao', r.texto_atualizador and r.texto_atualizador == r.texto, _('Texto do Dispositivo no Documento Alterador ' 'está igual ao Texto no Documento Original. ' @@ -2363,21 +2397,21 @@ class TextPendenciasView(ListView, CompMixin): 'Alterador.')) def warning(r): - type_pendencia = 'warning' - padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + type_notificacao = 'warning' + padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia', r.dispositivo_vigencia and r.inicio_vigencia != r.dispositivo_vigencia.inicio_vigencia, _('Data de início de Vigência difere da data início de ' 'Vigência do Dispositivo de Vigência')) - padd(r, type_pendencia, 'compilacao:ta_text', + padd(r, type_notificacao, 'compilacao:ta_text', r.inconstitucionalidade and not r.notas.exists(), _('Dispositivo está definido como inconstitucional. É ' 'aconcelhavel inserir uma Nota informando esta condição.'), kwargs={'ta_id': r.ta_id}, to_position=r.pk) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia', r.inconstitucionalidade and not ( r.inicio_vigencia == r.fim_vigencia and r.fim_vigencia == r.inicio_eficacia and @@ -2386,74 +2420,84 @@ class TextPendenciasView(ListView, CompMixin): 'existe diferença entre as datas início e fim de ' 'vigência e eficácia.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia', r.publicacao and r.ta_publicado and r.ta_publicado != r.publicacao.ta, _('A Publicação associada a este Dispositivo não é ' 'uma publicação do Texto Articulado Alterador.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia', not r.publicacao, _('Dispositivo sem registro de publicação.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia', r.texto and r.tipo_dispositivo.dispositivo_de_articulacao, _('Dispositivos de Articulação não ' 'deveriam armazenar texto.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', - not r.texto and r.tipo_dispositivo.dispositivo_de_articulacao, + padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia', + not r.texto and + not r.tipo_dispositivo.dispositivo_de_articulacao, _('Dispositivo está sem texto.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_alteracao', + padd(r, type_notificacao, 'compilacao:dispositivo_edit_alteracao', r.texto_atualizador and not r.ta_publicado, _('Existe Texto Atualizador, porém este Dispositivo não ' 'está associado a nenhum Documento Atualizador.')) def danger(r): - type_pendencia = 'danger' - padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + type_notificacao = 'danger' + padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia', not r.dispositivo_vigencia, _('Dispositivo sem definição de Dispositivo de Vigência.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', + padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia', r.inconstitucionalidade and r.inicio_vigencia != r.fim_vigencia, _('Dispositivo está definido como inconstitucional porém ' 'existe período de vigência.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_alteracao', + padd(r, type_notificacao, 'compilacao:dispositivo_edit_alteracao', r.ta_publicado and not r.dispositivo_atualizador, _('Dispositivo está associado a um Texto Articulado ' 'Atualizador mas, a nenhum Dispositivo Atualizador.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_alteracao', + padd(r, type_notificacao, 'compilacao:dispositivo_edit_alteracao', not r.dispositivo_atualizador and r.dispositivo_substituido, _('Dispositivo está substituindo outro mas não foi informado ' 'o Dispositivo Atualizador.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_alteracao', + padd(r, type_notificacao, 'compilacao:dispositivo_edit_alteracao', + r.dispositivo_substituido and r.dispositivo_substituido.tipo_dispositivo != r.tipo_dispositivo, _('Dispositivo está substituindo um Dispositivo ' 'de outro tipo.')) - padd(r, type_pendencia, 'compilacao:dispositivo_edit_alteracao', + padd(r, type_notificacao, 'compilacao:dispositivo_edit_alteracao', + r.dispositivo_substituido and r.dispositivo_substituido.ta != r.ta, _('Dispositivo está substituindo um Dispositivo de outro ' 'Texto Articulado.')) + rr = [] for r in result: p = [] r.contextual_class = "" - # sucess - success(r) - info(r) - warning(r) - danger(r) + type_notificacoes = [] + if 'type_notificacoes' in self.request.session: + type_notificacoes = self.request.session['type_notificacoes'] - r.pendencias = p + if isinstance(type_notificacoes, list): + for f in type_notificacoes: + if f != 'default': + locals()[f](r) - return result + r.notificacoes = p + + if p or 'default' in type_notificacoes: + rr.append(r) + + return rr diff --git a/materia/migrations/0031_merge.py b/materia/migrations/0031_merge.py new file mode 100644 index 000000000..4912ef045 --- /dev/null +++ b/materia/migrations/0031_merge.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.5 on 2016-05-03 20:05 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0030_auto_20160502_1630'), + ('materia', '0030_auto_20160429_1349'), + ] + + operations = [ + ] diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 3e58ac721..a1f9a195c 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -1063,7 +1063,7 @@ a:link:after, a:visited:after { } } -.table-pendencias { +.table-notificacoes { tbody { tr { td { diff --git a/templates/compilacao/layout/bootstrap_btn_checkbox.html b/templates/compilacao/layout/bootstrap_btn_checkbox.html new file mode 100644 index 000000000..736af1e8b --- /dev/null +++ b/templates/compilacao/layout/bootstrap_btn_checkbox.html @@ -0,0 +1,12 @@ +{% load crispy_forms_filters %} +{% load l10n %} +
+ {% include 'bootstrap3/layout/field_errors_block.html' %} + {% for choice in field.field.choices %} + + {% endfor %} + {% include 'bootstrap3/layout/help_text.html' %} +
diff --git a/templates/compilacao/text_list.html b/templates/compilacao/text_list.html index 99db8a044..f0aa0874e 100644 --- a/templates/compilacao/text_list.html +++ b/templates/compilacao/text_list.html @@ -14,6 +14,7 @@ {% block actions %} diff --git a/templates/compilacao/text_pendencias.html b/templates/compilacao/text_notificacoes.html similarity index 88% rename from templates/compilacao/text_pendencias.html rename to templates/compilacao/text_notificacoes.html index ba59856d7..ea7b2e477 100644 --- a/templates/compilacao/text_pendencias.html +++ b/templates/compilacao/text_notificacoes.html @@ -1,16 +1,21 @@ {% extends "base.html" %} -{% load i18n compilacao_filters common_tags sass_tags%} +{% load i18n crispy_forms_tags compilacao_filters common_tags sass_tags%} {% block base_content %} - +{{title}} {% block head_content %}{{block.super}} {% endblock %} - + + + {% crispy form %} + + +
- + @@ -34,7 +39,7 @@ {% if dpt.contextual_class %}
{% trans "Dispositivos" %}{% trans "Pendências" %}{% trans "Notificações" %}