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) InlineRadios, StrictButton)
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset, from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset,
Layout, Row) Layout, Row, Submit)
from django import forms from django import forms
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
from django.db.models import Q from django.db.models import Q
@ -1077,3 +1077,28 @@ class DispositivoEdicaoAlteracaoForm(ModelForm):
nd.fim_eficacia = nd.dispositivo_subsequente.inicio_eficacia - \ nd.fim_eficacia = nd.dispositivo_subsequente.inicio_eficacia - \
timedelta(days=1) timedelta(days=1)
nd.save() 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', url(r'^(?P<ta_id>[0-9]+)/text/edit',
views.TextEditView.as_view(), name='ta_text_edit'), views.TextEditView.as_view(), name='ta_text_edit'),
url(r'^(?P<ta_id>[0-9]+)/text/pendencias', url(r'^(?P<ta_id>[0-9]+)/text/notifications',
views.TextPendenciasView.as_view(), name='ta_text_pendencias'), views.TextNotificacoesView.as_view(), name='ta_text_notificacoes'),
url(r'^(?P<ta_id>[0-9]+)/text/(?P<dispositivo_id>[0-9]+)/$', url(r'^(?P<ta_id>[0-9]+)/text/(?P<dispositivo_id>[0-9]+)/$',
views.DispositivoView.as_view(), name='dispositivo'), views.DispositivoView.as_view(), name='dispositivo'),

128
compilacao/views.py

@ -1,6 +1,6 @@
import sys
from collections import OrderedDict from collections import OrderedDict
from datetime import datetime, timedelta from datetime import datetime, timedelta
import sys
from braces.views import FormMessagesMixin from braces.views import FormMessagesMixin
from django import forms 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.base import TemplateView
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
from django.views.generic.edit import (CreateView, DeleteView, FormView, from django.views.generic.edit import (CreateView, DeleteView, FormView,
UpdateView) UpdateView, FormMixin)
from django.views.generic.list import ListView from django.views.generic.list import ListView
from compilacao.forms import (DispositivoDefinidorVigenciaForm, from compilacao.forms import (DispositivoDefinidorVigenciaForm,
@ -28,7 +28,8 @@ from compilacao.forms import (DispositivoDefinidorVigenciaForm,
DispositivoEdicaoBasicaForm, DispositivoEdicaoBasicaForm,
DispositivoEdicaoVigenciaForm, DispositivoEdicaoVigenciaForm,
DispositivoSearchModalForm, NotaForm, DispositivoSearchModalForm, NotaForm,
PublicacaoForm, TaForm, TipoTaForm, VideForm) PublicacaoForm, TaForm, TipoTaForm, VideForm,
TextNotificacoesForm)
from compilacao.models import (Dispositivo, Nota, from compilacao.models import (Dispositivo, Nota,
PerfilEstruturalTextoArticulado, Publicacao, PerfilEstruturalTextoArticulado, Publicacao,
TextoArticulado, TipoDispositivo, TipoNota, TextoArticulado, TipoDispositivo, TipoNota,
@ -37,6 +38,7 @@ from compilacao.models import (Dispositivo, Nota,
from compilacao.utils import DISPOSITIVO_SELECT_RELATED from compilacao.utils import DISPOSITIVO_SELECT_RELATED
from crud.base import Crud, CrudListView, make_pagination from crud.base import Crud, CrudListView, make_pagination
TipoNotaCrud = Crud.build(TipoNota, 'tipo_nota') TipoNotaCrud = Crud.build(TipoNota, 'tipo_nota')
TipoVideCrud = Crud.build(TipoVide, 'tipo_vide') TipoVideCrud = Crud.build(TipoVide, 'tipo_vide')
TipoPublicacaoCrud = Crud.build(TipoPublicacao, 'tipo_publicacao') TipoPublicacaoCrud = Crud.build(TipoPublicacao, 'tipo_publicacao')
@ -2294,8 +2296,40 @@ class DispositivoEdicaoAlteracaoView(FormMessagesMixin, UpdateView):
return self.form_invalid(form) return self.form_invalid(form)
class TextPendenciasView(ListView, CompMixin): class TextNotificacoesView(ListView, CompMixin, FormView):
template_name = 'compilacao/text_pendencias.html' 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): def get_queryset(self):
@ -2305,57 +2339,57 @@ class TextPendenciasView(ListView, CompMixin):
p = [] 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): kwargs=None, to_position=None):
if not test: if not test:
return return
r.contextual_class = type_pendencia r.contextual_class = type_notificacao
if not kwargs: if not kwargs:
kwargs = {'ta_id': r.ta_id, 'pk': r.pk} kwargs = {'ta_id': r.ta_id, 'pk': r.pk}
if reverse_url: if reverse_url:
p.append((type_pendencia, msg, p.append((type_notificacao, msg,
reverse_lazy(reverse_url, kwargs=kwargs), reverse_lazy(reverse_url, kwargs=kwargs),
to_position)) to_position))
else: else:
p.append((type_pendencia, msg, None, to_position)) p.append((type_notificacao, msg, None, to_position))
def success(r): def success(r):
type_pendencia = 'success' type_notificacao = 'success'
padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia',
r.inconstitucionalidade, r.inconstitucionalidade,
_('Declarado Inconstitucional.')) _('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, r.ta_publicado and r.dispositivo_atualizador,
_('Dispositivo alterado em %s' % r.ta_publicado), _('Dispositivo alterado em %s' % r.ta_publicado),
{'ta_id': r.ta_publicado_id}, r.dispositivo_atualizador_id) {'ta_id': r.ta_publicado_id}, r.dispositivo_atualizador_id)
def info(r): def info(r):
type_pendencia = 'info' type_notificacao = 'info'
padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia',
r.publicacao and r.publicacao and
r.dispositivo_vigencia and r.dispositivo_vigencia and
r.publicacao.data != r.dispositivo_vigencia.inicio_vigencia, r.publicacao.data != r.dispositivo_vigencia.inicio_vigencia,
_('Data da publicação associada ao Dispositivo difere da data' _('Data da publicação associada ao Dispositivo difere da data'
' de inicio de vigência do Dispositivo de vigência.')) ' 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, r.publicacao and r.publicacao.data != r.inicio_vigencia,
_('Data da publicação associada ao Dispositivo difere ' _('Data da publicação associada ao Dispositivo difere '
'da data de inicio de vigência.')) '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.rotulo != r.rotulo_padrao(local_insert=1),
_('Rótulo Diferente do Padrão')) _('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, r.texto_atualizador and r.texto_atualizador != r.texto,
_('Texto do Dispositivo para o Documento ' _('Texto do Dispositivo para o Documento '
'está diferente do texto para o Documento Alterador.')) '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, r.texto_atualizador and r.texto_atualizador == r.texto,
_('Texto do Dispositivo no Documento Alterador ' _('Texto do Dispositivo no Documento Alterador '
'está igual ao Texto no Documento Original. ' 'está igual ao Texto no Documento Original. '
@ -2363,21 +2397,21 @@ class TextPendenciasView(ListView, CompMixin):
'Alterador.')) 'Alterador.'))
def warning(r): def warning(r):
type_pendencia = 'warning' type_notificacao = 'warning'
padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia',
r.dispositivo_vigencia and r.inicio_vigencia != r.dispositivo_vigencia and r.inicio_vigencia !=
r.dispositivo_vigencia.inicio_vigencia, r.dispositivo_vigencia.inicio_vigencia,
_('Data de início de Vigência difere da data início de ' _('Data de início de Vigência difere da data início de '
'Vigência do Dispositivo de Vigência')) '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(), r.inconstitucionalidade and not r.notas.exists(),
_('Dispositivo está definido como inconstitucional. É ' _('Dispositivo está definido como inconstitucional. É '
'aconcelhavel inserir uma Nota informando esta condição.'), 'aconcelhavel inserir uma Nota informando esta condição.'),
kwargs={'ta_id': r.ta_id}, kwargs={'ta_id': r.ta_id},
to_position=r.pk) 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.inconstitucionalidade and not (
r.inicio_vigencia == r.fim_vigencia and r.inicio_vigencia == r.fim_vigencia and
r.fim_vigencia == r.inicio_eficacia 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 ' 'existe diferença entre as datas início e fim de '
'vigência e eficácia.')) '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.publicacao and
r.ta_publicado and r.ta_publicado != r.publicacao.ta, r.ta_publicado and r.ta_publicado != r.publicacao.ta,
_('A Publicação associada a este Dispositivo não é ' _('A Publicação associada a este Dispositivo não é '
'uma publicação do Texto Articulado Alterador.')) '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, not r.publicacao,
_('Dispositivo sem registro de publicação.')) _('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, r.texto and r.tipo_dispositivo.dispositivo_de_articulacao,
_('Dispositivos de Articulação não ' _('Dispositivos de Articulação não '
'deveriam armazenar texto.')) 'deveriam armazenar texto.'))
padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia',
not r.texto and r.tipo_dispositivo.dispositivo_de_articulacao, not r.texto and
not r.tipo_dispositivo.dispositivo_de_articulacao,
_('Dispositivo está sem texto.')) _('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, r.texto_atualizador and not r.ta_publicado,
_('Existe Texto Atualizador, porém este Dispositivo não ' _('Existe Texto Atualizador, porém este Dispositivo não '
'está associado a nenhum Documento Atualizador.')) 'está associado a nenhum Documento Atualizador.'))
def danger(r): def danger(r):
type_pendencia = 'danger' type_notificacao = 'danger'
padd(r, type_pendencia, 'compilacao:dispositivo_edit_vigencia', padd(r, type_notificacao, 'compilacao:dispositivo_edit_vigencia',
not r.dispositivo_vigencia, not r.dispositivo_vigencia,
_('Dispositivo sem definição de Dispositivo de Vigência.')) _('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.inconstitucionalidade and
r.inicio_vigencia != r.fim_vigencia, r.inicio_vigencia != r.fim_vigencia,
_('Dispositivo está definido como inconstitucional porém ' _('Dispositivo está definido como inconstitucional porém '
'existe período de vigência.')) '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, r.ta_publicado and not r.dispositivo_atualizador,
_('Dispositivo está associado a um Texto Articulado ' _('Dispositivo está associado a um Texto Articulado '
'Atualizador mas, a nenhum Dispositivo Atualizador.')) '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 not r.dispositivo_atualizador and
r.dispositivo_substituido, r.dispositivo_substituido,
_('Dispositivo está substituindo outro mas não foi informado ' _('Dispositivo está substituindo outro mas não foi informado '
'o Dispositivo Atualizador.')) '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.dispositivo_substituido.tipo_dispositivo !=
r.tipo_dispositivo, r.tipo_dispositivo,
_('Dispositivo está substituindo um Dispositivo ' _('Dispositivo está substituindo um Dispositivo '
'de outro tipo.')) '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, r.dispositivo_substituido.ta != r.ta,
_('Dispositivo está substituindo um Dispositivo de outro ' _('Dispositivo está substituindo um Dispositivo de outro '
'Texto Articulado.')) 'Texto Articulado.'))
rr = []
for r in result: for r in result:
p = [] p = []
r.contextual_class = "" r.contextual_class = ""
# sucess type_notificacoes = []
success(r) if 'type_notificacoes' in self.request.session:
info(r) type_notificacoes = self.request.session['type_notificacoes']
warning(r)
danger(r)
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 { tbody {
tr { tr {
td { 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 %} {% block actions %}
<div class="clearfix"> <div class="clearfix">
<div class="actions btn-group pull-right" role="group"> <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> <a href="{% url 'compilacao:ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Texto' %}</a>
</div> </div>
</div> </div>

15
templates/compilacao/text_pendencias.html → templates/compilacao/text_notificacoes.html

@ -1,16 +1,21 @@
{% extends "base.html" %} {% 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 %} {% block base_content %}
{{title}}
{% block head_content %}{{block.super}} {% block head_content %}{{block.super}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css"> <link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
{% endblock %} {% endblock %}
<table class="table table-striped table-hover table-pendencias">
{% crispy form %}
<table class="table table-striped table-hover table-notificacoes">
<thead> <thead>
<tr> <tr>
<th>{% trans "Dispositivos" %}</th> <th>{% trans "Dispositivos" %}</th>
<th>{% trans "Pendências" %}</th> <th>{% trans "Notificações" %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -34,7 +39,7 @@
{% if dpt.contextual_class %} {% if dpt.contextual_class %}
<td> <td>
<ul> <ul>
{% for p in dpt.pendencias %} {% for p in dpt.notificacoes %}
<li> <li>
{%if p.2 %} {%if p.2 %}
<a target="_blank" class="text-{{p.0}}" href="{{p.2}}{%if p.3 %}#{{p.3}}{% endif %}"><u>{{p.1}}</u></a> <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="clearfix">
<div class="actions btn-group pull-right" role="group"> <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_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> <a href="{% url 'compilacao:ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Texto' %}</a>
</div> </div>
</div> </div>

Loading…
Cancel
Save