Browse Source

Criar Filtro em Nível de Notificação de Pendências

pull/384/head
LeandroRoberto 9 years ago
parent
commit
2e9ad97256
  1. 27
      compilacao/forms.py
  2. 4
      compilacao/urls.py
  3. 128
      compilacao/views.py
  4. 16
      materia/migrations/0031_merge.py
  5. 2
      static/styles/compilacao.scss
  6. 12
      templates/compilacao/layout/bootstrap_btn_checkbox.html
  7. 1
      templates/compilacao/text_list.html
  8. 15
      templates/compilacao/text_notificacoes.html
  9. 1
      templates/compilacao/textoarticulado_detail.html

27
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)

4
compilacao/urls.py

@ -27,8 +27,8 @@ urlpatterns_compilacao = [
url(r'^(?P<ta_id>[0-9]+)/text/edit',
views.TextEditView.as_view(), name='ta_text_edit'),
url(r'^(?P<ta_id>[0-9]+)/text/pendencias',
views.TextPendenciasView.as_view(), name='ta_text_pendencias'),
url(r'^(?P<ta_id>[0-9]+)/text/notifications',
views.TextNotificacoesView.as_view(), name='ta_text_notificacoes'),
url(r'^(?P<ta_id>[0-9]+)/text/(?P<dispositivo_id>[0-9]+)/$',
views.DispositivoView.as_view(), name='dispositivo'),

128
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

16
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 = [
]

2
static/styles/compilacao.scss

@ -1063,7 +1063,7 @@ a:link:after, a:visited:after {
}
}
.table-pendencias {
.table-notificacoes {
tbody {
tr {
td {

12
templates/compilacao/layout/bootstrap_btn_checkbox.html

@ -0,0 +1,12 @@
{% load crispy_forms_filters %}
{% load l10n %}
<div class="controls {{ field_class }} btn-group" data-toggle="buttons" {% if flat_attrs %} {{ flat_attrs|safe }}{% endif %}>
{% include 'bootstrap3/layout/field_errors_block.html' %}
{% for choice in field.field.choices %}
<label class="btn btn-default {% if choice.0 in field.value or choice.0|stringformat:"s" in field.value or choice.0|stringformat:"s" == field.value|stringformat:"s" %}active{% endif %}">
<input type="checkbox" {% if choice.0 in field.value or choice.0|stringformat:"s" in field.value or choice.0|stringformat:"s" == field.value|stringformat:"s" %} checked="checked" {% endif %} name="{{ field.html_name }}" id="id_{{ field.html_name }}_{{ forloop.counter }}" value="{{ choice.0|unlocalize }}" {{ field.field.widget.attrs|flatatt }}>
<span class="text-{{choice.0}}" >{{ choice.1|unlocalize }}</span>
</label>
{% endfor %}
{% include 'bootstrap3/layout/help_text.html' %}
</div>

1
templates/compilacao/text_list.html

@ -14,6 +14,7 @@
{% block actions %}
<div class="clearfix">
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'compilacao:ta_text_notificacoes' object.pk %}" class="btn btn-default">{% trans 'Notificações' %}</a>
<a href="{% url 'compilacao:ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Texto' %}</a>
</div>
</div>

15
templates/compilacao/text_pendencias.html → 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}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
{% endblock %}
<table class="table table-striped table-hover table-pendencias">
{% crispy form %}
<table class="table table-striped table-hover table-notificacoes">
<thead>
<tr>
<th>{% trans "Dispositivos" %}</th>
<th>{% trans "Pendências" %}</th>
<th>{% trans "Notificações" %}</th>
</tr>
</thead>
<tbody>
@ -34,7 +39,7 @@
{% if dpt.contextual_class %}
<td>
<ul>
{% for p in dpt.pendencias %}
{% for p in dpt.notificacoes %}
<li>
{%if p.2 %}
<a target="_blank" class="text-{{p.0}}" href="{{p.2}}{%if p.3 %}#{{p.3}}{% endif %}"><u>{{p.1}}</u></a>

1
templates/compilacao/textoarticulado_detail.html

@ -25,6 +25,7 @@
<div class="clearfix">
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'compilacao:ta_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Metadados do Texto Articulado' %}</a>
<a href="{% url 'compilacao:ta_text_notificacoes' object.pk %}" class="btn btn-default">{% trans 'Notificações' %}</a>
<a href="{% url 'compilacao:ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Texto' %}</a>
</div>
</div>

Loading…
Cancel
Save