Browse Source

Fix #3182 - Dispensa do Interstício (#3224)

* Fix #3182 - Adicionar matéria

* Fix #3182 - Adicionar várias matérias

* Refatoração
pull/3165/head
João Rodrigues 4 years ago
committed by GitHub
parent
commit
d65e80733b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 8
      sapl/sessao/forms.py
  2. 6
      sapl/sessao/urls.py
  3. 55
      sapl/sessao/views.py
  4. 173
      sapl/templates/sessao/adicionar_varias_materias_expediente.html
  5. 129
      sapl/templates/sessao/expedientemateria_form.html

8
sapl/sessao/forms.py

@ -349,14 +349,6 @@ class ExpedienteMateriaForm(ModelForm):
else:
cleaned_data['materia'] = materia
exists = self._model.objects.filter(
sessao_plenaria=sessao,
materia=materia).exists()
if exists and not self.instance.pk:
msg = _('Essa matéria já foi cadastrada.')
raise ValidationError(msg)
return cleaned_data
def save(self, commit=False):

6
sapl/sessao/urls.py

@ -36,7 +36,8 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente,
OrdemDiaLeituraView,
retirar_leitura,
TransferenciaMateriasExpediente, TransferenciaMateriasOrdemDia,
filtra_materias_copia_sessao_ajax)
filtra_materias_copia_sessao_ajax, verifica_materia_sessao_plenaria_ajax)
from .apps import AppConfig
@ -80,6 +81,9 @@ urlpatterns = [
url(r'^sessao/filtra-materias-copia-sessao-ajax/',
filtra_materias_copia_sessao_ajax,
name='filtra_materias_copia_sessao_ajax_view'),
url(r'^sessao/verifica-materia-sessao-plenaria-ajax/',
verifica_materia_sessao_plenaria_ajax,
name='verifica_materia_sessao_plenaria_ajax_view'),
url(r'^sessao/(?P<pk>\d+)/(?P<spk>\d+)/abrir-votacao$',
abrir_votacao,

55
sapl/sessao/views.py

@ -736,6 +736,11 @@ class MateriaOrdemDiaCrud(MasterDetailCrud):
class CreateView(MasterDetailCrud.CreateView):
form_class = OrdemDiaForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["tipo_materia_sessao"] = MATERIAS_ORDEMDIA
return context
def get_initial(self):
self.initial['data_ordem'] = SessaoPlenaria.objects.get(
pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y')
@ -753,6 +758,17 @@ class MateriaOrdemDiaCrud(MasterDetailCrud):
class UpdateView(MasterDetailCrud.UpdateView):
form_class = OrdemDiaForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["tipo_materia_sessao"] = MATERIAS_ORDEMDIA
context["tipo_materia_salvo"] = self.object.materia.tipo.id
context["numero_materia_salvo"] = self.object.materia.numero
context["ano_materia_salvo"] = self.object.materia.ano
return context
def get_initial(self):
initial = super().get_initial()
@ -833,6 +849,11 @@ class ExpedienteMateriaCrud(MasterDetailCrud):
class CreateView(MasterDetailCrud.CreateView):
form_class = ExpedienteMateriaForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["tipo_materia_sessao"] = MATERIAS_EXPEDIENTE
return context
def get_initial(self):
initial = super().get_initial()
initial['data_ordem'] = SessaoPlenaria.objects.get(
@ -851,6 +872,17 @@ class ExpedienteMateriaCrud(MasterDetailCrud):
class UpdateView(MasterDetailCrud.UpdateView):
form_class = ExpedienteMateriaForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["tipo_materia_sessao"] = MATERIAS_EXPEDIENTE
context["tipo_materia_salvo"] = self.object.materia.tipo.id
context["numero_materia_salvo"] = self.object.materia.numero
context["ano_materia_salvo"] = self.object.materia.ano
return context
def get_initial(self):
initial = super().get_initial()
@ -3719,11 +3751,31 @@ def retira_materias_ja_adicionadas(id_sessao, model):
return lista_id_materias
def verifica_materia_sessao_plenaria_ajax(request):
# Define se a matéria é do expediente ou da ordem do dia
tipo_materia_sessao = int(request.GET['tipo_materia_sessao'])
id_materia_selecionada = request.GET['id_materia_selecionada']
pk_sessao_plenaria = request.GET['pk_sessao_plenaria']
if tipo_materia_sessao == MATERIAS_EXPEDIENTE:
is_materia_presente = ExpedienteMateria.objects.filter(
sessao_plenaria=pk_sessao_plenaria, materia=id_materia_selecionada
).exists()
elif tipo_materia_sessao == MATERIAS_ORDEMDIA:
is_materia_presente = OrdemDia.objects.filter(
sessao_plenaria=pk_sessao_plenaria, materia=id_materia_selecionada
).exists()
return JsonResponse({ 'is_materia_presente': is_materia_presente })
class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin,
MateriaLegislativaPesquisaView):
filterset_class = AdicionarVariasMateriasFilterSet
template_name = 'sessao/adicionar_varias_materias_expediente.html'
app_label = AppConfig.label
tipo_materia_sessao = MATERIAS_EXPEDIENTE
logger = logging.getLogger(__name__)
@ -3764,6 +3816,8 @@ class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin,
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
context['pk_sessao'] = self.kwargs['pk']
context["tipo_materia_sessao"] = self.tipo_materia_sessao
return context
def post(self, request, *args, **kwargs):
@ -3815,6 +3869,7 @@ class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin,
class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente):
filterset_class = AdicionarVariasMateriasFilterSet
template_name = 'sessao/adicionar_varias_materias_ordem.html'
tipo_materia_sessao = MATERIAS_ORDEMDIA
logger = logging.getLogger(__name__)

173
sapl/templates/sessao/adicionar_varias_materias_expediente.html

@ -4,19 +4,16 @@
{% block actions %}{% endblock %}
{% block detail_content %}
{% block buttons %}
{% block buttons %}
{% if filter_url and not filter.form.errors %}
<div class="actions btn-group float-right" role="group">
<a href="{% url 'sapl.sessao:adicionar_varias_materias_expediente' pk_sessao %}" class="btn btn-outline-primary">{% trans 'Fazer nova pesquisa' %}</a>
</div>
<div class="actions btn-group float-right" role="group">
<a href="{% url 'sapl.sessao:expedientemateria_list' pk_sessao %}" class="btn btn-outline-primary">{% trans 'Matérias do Expediente' %}</a>
</div>
<div class="actions btn-group float-right" role="group">
<a href="{% url 'sapl.sessao:adicionar_varias_materias_expediente' pk_sessao %}" class="btn btn-outline-primary">{% trans 'Fazer nova pesquisa' %}</a>
</div>
<div class="actions btn-group float-right" role="group">
<a href="{% url 'sapl.sessao:expedientemateria_list' pk_sessao %}" class="btn btn-outline-primary">{% trans 'Matérias do Expediente' %}</a>
</div>
{% endif %}
{% endblock %}
{% if filter.form.errors %}
@ -29,77 +26,105 @@
<p></p>
{% if filter_url and not filter.form.errors %}
{% if paginator.count %}
<form method="POST" enctype="application/x-www-form-urlencoded">
{% csrf_token %}
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr>
<td><h3>{% trans "Matérias" %}</h3></td>
<td><h3>{% trans "Tipo de Votação" %}</h3></td>
</tr>
</thead>
{% if paginator.count > 1 %}
<h3>{% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}</h3>
{% elif paginator.count == 1 %}
<h3>{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}</h3>
{% endif %}
{% for m in page_obj %}
<tr>
<td>
<input type="checkbox" name="materia_id" id="{{m.id}}" value="{{m.id}}" {% if check %} checked {% endif %}>
<strong><a href="{% url 'sapl.materia:materialegislativa_detail' m.id %}">{{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}</strong></a></br>
<strong>Autores:</strong>
{% for a in m.autoria_set.all %}
{% if not forloop.first %}
, &nbsp;&nbsp; {{a.autor|default_if_none:""}}
{% else %}
&nbsp;{{a.autor|default_if_none:""}}
{% endif %}
{% endfor %}
</br>
<strong>Localização Atual:</strong> &nbsp;{{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não informado"}}</br>
<strong>Status:</strong> &nbsp;{{m.tramitacao_set.last.status|default_if_none:"Não informado"}}</br>
<strong>Data da última Tramitação:</strong> &nbsp;{{m.tramitacao_set.last.data_tramitacao|default_if_none:"Não informado"}}</br>
<strong>Ementa:</strong>&nbsp;{{ m.ementa|safe }}</br>
<p></p>
<td width="20%%">
<input type="radio" name="tipo_votacao_{{m.id}}" id="tipo_votacao_{{m.id}}_1" value="1"> <label for="tipo_votacao_{{m.id}}_1">Simbólica</label>
</br>
<input type="radio" name="tipo_votacao_{{m.id}}" id="tipo_votacao_{{m.id}}_2" value="2"> <label for="tipo_votacao_{{m.id}}_2">Nominal</label>
</br>
<input type="radio" name="tipo_votacao_{{m.id}}" id="tipo_votacao_{{m.id}}_3" value="3"> <label for="tipo_votacao_{{m.id}}_3">Secreta</label>
</br>
<input type="radio" name="tipo_votacao_{{m.id}}" id="tipo_votacao_{{m.id}}_4" value="4"> <label for="tipo_votacao_{{m.id}}_4">Leitura</label>
</td>
</td>
</tr>
{% endfor %}
</table>
<input type="submit" value="Adicionar matérias selecionadas" class="btn btn-primary"S>
</form>
{% else %}
<table class="table table-striped table-bordered">
{% if paginator.count %}
<form method="POST" enctype="application/x-www-form-urlencoded">
{% csrf_token %}
<table class="table table-striped table-bordered">
<thead class="thead-default">
<tr><td><h3>{% trans "Matérias" %}</h3></td><td><h3>{% trans "Tipo de Votação" %}</h3></td></tr>
</thead>
{% if paginator.count > 1 %}
<h3>{% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{ total_materias }} matérias.{% endblocktrans %}</h3>
{% elif paginator.count == 1 %}
<h3>{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}</h3>
{% endif %}
{% for m in page_obj %}
<tr>
<td>
<h3>Nenhuma matéria encontrada com essas especificações</h3>
<td>
<input type="checkbox" name="materia_id" id="{{ m.id }}" value="{{ m.id }}" {% if check %} checked {% endif %}>
<strong><a href="{% url 'sapl.materia:materialegislativa_detail' m.id %}">{{ m.tipo.sigla }} {{ m.numero }}/{{ m.ano }} - {{ m.tipo }}</strong></a></br>
<strong>Autores:</strong>
{% for a in m.autoria_set.all %}
{% if not forloop.first %}
, &nbsp;&nbsp; {{ a.autor|default_if_none:"" }}
{% else %}
&nbsp;{{ a.autor|default_if_none:"" }}
{% endif %}
{% endfor %}
</br>
<strong>Localização Atual:</strong> &nbsp;{{ m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não informado" }}</br>
<strong>Status:</strong> &nbsp;{{ m.tramitacao_set.last.status|default_if_none:"Não informado" }}</br>
<strong>Data da última Tramitação:</strong> &nbsp;{{ m.tramitacao_set.last.data_tramitacao|default_if_none:"Não informado" }}</br>
<strong>Ementa:</strong>&nbsp;{{ m.ementa|safe }}</br>
<p></p>
<td width="20%%">
<input type="radio" name="tipo_votacao_{{ m.id }}" id="tipo_votacao_{{ m.id }}_1" value="1"> <label for="tipo_votacao_{{ m.id }}_1">Simbólica</label>
</br>
<input type="radio" name="tipo_votacao_{{ m.id }}" id="tipo_votacao_{{ m.id }}_2" value="2"> <label for="tipo_votacao_{{ m.id }}_2">Nominal</label>
</br>
<input type="radio" name="tipo_votacao_{{ m.id }}" id="tipo_votacao_{{ m.id }}_3" value="3"> <label for="tipo_votacao_{{ m.id }}_3">Secreta</label>
</br>
<input type="radio" name="tipo_votacao_{{ m.id }}" id="tipo_votacao_{{ m.id }}_4" value="4"> <label for="tipo_votacao_{{ m.id }}_4">Leitura</label>
</td>
</td>
</tr>
</table>
{% endif %}
{% endif %}
{% endfor %}
</table>
<input type="submit" value="Adicionar matérias selecionadas" class="btn btn-primary"S>
</form>
{% else %}
<table class="table table-striped table-bordered"><tr><td><h3>Nenhuma matéria encontrada com essas especificações</h3></td></tr></table>
{% endif %}
{% endif %}
{% endblock detail_content %}
{% block extra_js %}
<script>
var modal_estilos = 'display: block; width: 85%; max-width: 600px; background: #fff; padding: 15px; border-radius: 5px;'
+'-webkit-box-shadow: 0px 6px 14px -2px rgba(0, 0, 0, 0.75); -moz-box-shadow: 0px 6px 14px -2px rgba(0, 0, 0, 0.75);'
+'box-shadow: 0px 6px 14px -2px rgba(0, 0, 0, 0.75); position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%);'
+'z-index: 99999999; text-align: center';
var fundo_modal_estilos = 'top: 0; right: 0; bottom: 0; left: 0; position: fixed; background-color: rgba(0, 0, 0, 0.6);'
+'z-index: 99999999; display: none;';
var modal = '<div id="fundo_modal" style="'+fundo_modal_estilos+'">'
+'<div id="modal" style="'+modal_estilos+'">'
+'<h2>Atenção!</h2><br/>'
+'<h3>A matéria selecionada já foi adicionada na sessão. Essa matéria será duplicada.</h3><br/>'
+'<button id="close_model_btn" type="button" class="btn btn-warning mb-2" data-dimiss="model">'
+'Compreendo e quero continuar'
+'</button>'
+'</div>'
+'</div>';
$(document).ready( function() {
$("body").append(modal)
$('input[name=materia_id]').change( function() {
if ($(this).is(':checked')){
// Define se a matéria é do expediente ou da ordem do dia
let tipo_materia_sessao = "{{ tipo_materia_sessao }}"
let id_materia = $(this).val()
let pk_sessao_plenaria = "{{ root_pk }}"
$.get("{% url 'sapl.sessao:verifica_materia_sessao_plenaria_ajax_view' %}",
{ id_materia_selecionada: id_materia, tipo_materia_sessao: tipo_materia_sessao, pk_sessao_plenaria: pk_sessao_plenaria },
function(data) {
let is_materia_presente = data['is_materia_presente']
if (is_materia_presente){
$('#fundo_modal').fadeIn()
}
});
}
});
$(window).on('beforeunload', function () {
$("input[type=submit], input[type=button]").prop("disabled", "disabled");
});
$("#fundo_modal, #close_model_btn").click( function() { $("#fundo_modal").hide() });
$("#modal").click( function(e) { e.stopPropagation() });
});
$(window).on('beforeunload', function() {
$("input[type=submit], input[type=button]").prop("disabled", "disabled")
});
</script>
{% endblock extra_js%}
{% endblock extra_js %}

129
sapl/templates/sessao/expedientemateria_form.html

@ -4,54 +4,91 @@
{% load common_tags %}
{% block extra_js %}
<script language="Javascript">
// document.getElementById("id_observacao").readOnly = true;
<script language="Javascript">
//document.getElementById("id_observacao").readOnly = true;
function recuperar_materia() {
var tipo_materia = $("#id_tipo_materia").val()
var numero_materia = $("#id_numero_materia").val()
var ano_materia = $("#id_ano_materia").val()
if (tipo_materia && numero_materia && ano_materia) {
$.get("/sessao/recuperar-materia", {
tipo_materia: tipo_materia,
numero_materia: numero_materia,
ano_materia: ano_materia
},
function(data, status) {
if ($(".ementa-materia").length === 0) {
$("#div_id_tipo_materia").closest('.row').after(
$('<div class="row"/>').append(
$('<div class="col-xs-12"/>').append(
$('<div class="alert alert-info ementa-materia"/>').html(data.ementa))))
}
else {
$('.ementa-materia').html(data.ementa)
}
function recuperar_materia() {
var tipo_materia = $("#id_tipo_materia").val()
var numero_materia = $("#id_numero_materia").val()
var ano_materia = $("#id_ano_materia").val()
if (tipo_materia && numero_materia && ano_materia){
$.get("/sessao/recuperar-materia",
{ tipo_materia: tipo_materia, numero_materia: numero_materia, ano_materia: ano_materia },
function(data, status) {
if ($(".ementa-materia").length === 0){
$("#div_id_tipo_materia").closest('.row').after($('<div class="row"/>').append($('<div class="col-xs-12"/>').append(
$('<div class="alert alert-info ementa-materia"/>').html(data.ementa)
)))
}
else {
$('.ementa-materia').html(data.ementa)
}
let tipo_materia_salvo = "{{ tipo_materia_salvo }}"
let numero_materia_salvo = "{{ numero_materia_salvo }}"
let ano_materia_salvo = "{{ ano_materia_salvo }}"
if (tipo_materia !== tipo_materia_salvo || numero_materia !== numero_materia_salvo || ano_materia !== ano_materia_salvo){
let id_materia = data.id
if (id_materia){
// Define se a matéria é do expediente ou da ordem do dia
let tipo_materia_sessao = "{{ tipo_materia_sessao }}"
let pk_sessao_plenaria = "{{ root_pk }}"
$.get("{% url 'sapl.sessao:verifica_materia_sessao_plenaria_ajax_view' %}",
{ id_materia_selecionada: id_materia, tipo_materia_sessao: tipo_materia_sessao, pk_sessao_plenaria: pk_sessao_plenaria },
function(data) {
let is_materia_presente = data['is_materia_presente']
if (is_materia_presente){
$('#fundo_modal').fadeIn()
}
});
}
}
});
}
}
var fields = ["#id_tipo_materia", "#id_numero_materia", "#id_ano_materia"];
for (i = 0; i < fields.length; i++) {
$(fields[i]).change(recuperar_materia);
}
recuperar_materia();
$(document).ready(function(){
$("select[name='tipo_votacao']").children("option[value='4']").remove();
$('#id_apenas_leitura').change(function(event){
$('#div_id_tipo_votacao').toggle();
if($('#id_apenas_leitura').prop('checked')){
$("select[name='tipo_votacao']").append(new Option('Leitura', '4'));
$("select[name='tipo_votacao']").val('4');
}
else{
$("select[name='tipo_votacao']").children("option[value='4']").remove();
$("select[name='tipo_votacao']").val('1');
}
})
});
</script>
}
var fields = ["#id_tipo_materia", "#id_numero_materia", "#id_ano_materia"];
for (i = 0; i < fields.length; i++){
$(fields[i]).change(recuperar_materia)
}
recuperar_materia()
var modal_estilos = 'display: block; width: 85%; max-width: 600px; background: #fff; padding: 15px; border-radius: 5px;'
+'-webkit-box-shadow: 0px 6px 14px -2px rgba(0, 0, 0, 0.75); -moz-box-shadow: 0px 6px 14px -2px rgba(0, 0, 0, 0.75);'
+'box-shadow: 0px 6px 14px -2px rgba(0, 0, 0, 0.75); position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%);'
+'z-index: 99999999; text-align: center';
var fundo_modal_estilos = 'top: 0; right: 0; bottom: 0; left: 0; position: fixed; background-color: rgba(0, 0, 0, 0.6); z-index: 99999999;'
+'display: none;';
var modal = '<div id="fundo_modal" style="'+fundo_modal_estilos+'">'
+'<div id="modal" style="'+modal_estilos+'">'
+'<h2>Atenção!</h2><br/>'
+'<h3>A matéria selecionada já foi adicionada na sessão. Essa matéria será duplicada.</h3><br/>'
+'<button id="close_model_btn" type="button" class="btn btn-warning mb-2" data-dimiss="model">Compreendo e quero continuar</button>'
+'</div>'
+'</div>';
$(document).ready( function() {
$("body").append(modal)
$("select[name='tipo_votacao']").children("option[value='4']").remove();
$('#id_apenas_leitura').change( function(event) {
$('#div_id_tipo_votacao').toggle()
if ($('#id_apenas_leitura').prop('checked')){
$("select[name='tipo_votacao']").append(new Option('Leitura', '4'))
$("select[name='tipo_votacao']").val('4')
} else {
$("select[name='tipo_votacao']").children("option[value='4']").remove()
$("select[name='tipo_votacao']").val('1')
}
});
$("#fundo_modal, #close_model_btn").click( function() { $("#fundo_modal").hide() });
$("#modal").click( function(e) { e.stopPropagation() });
});
</script>
{% endblock %}

Loading…
Cancel
Save