Browse Source

Merge branch '3.1.x'

pull/1828/merge
Edward Ribeiro 8 years ago
parent
commit
dd95322b01
  1. 2
      docker-compose.yml
  2. 4
      gunicorn_start.sh
  3. 20
      sapl/audiencia/views.py
  4. 8
      sapl/base/forms.py
  5. 1
      sapl/base/views.py
  6. 21
      sapl/materia/forms.py
  7. 46
      sapl/materia/views.py
  8. 15
      sapl/norma/forms.py
  9. 22
      sapl/norma/views.py
  10. 2
      sapl/parlamentares/forms.py
  11. 11
      sapl/protocoloadm/views.py
  12. 13
      sapl/sessao/forms.py
  13. 57
      sapl/sessao/views.py
  14. 2
      sapl/templates/materia/layouts.yaml
  15. 38
      sapl/templates/materia/materialegislativa_form.html
  16. 21
      sapl/templates/painel/index.html
  17. 10
      sapl/templates/protocoloadm/comprovante.html
  18. 2
      setup.py

2
docker-compose.yml

@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
image: interlegis/sapl:3.1.81
image: interlegis/sapl:3.1.87
restart: always
environment:
ADMIN_PASSWORD: interlegis

4
gunicorn_start.sh

@ -16,8 +16,9 @@ DJANGODIR=/var/interlegis/sapl/ # Django project directory (*
SOCKFILE=/var/interlegis/sapl/run/gunicorn.sock # we will communicate using this unix socket (*)
USER=`whoami` # the user to run as (*)
GROUP=`whoami` # the group to run as (*)
NUM_WORKERS=9 # how many worker processes should Gunicorn spawn (*)
NUM_WORKERS=4 # how many worker processes should Gunicorn spawn (*)
# NUM_WORKERS = 2 * CPUS + 1
MAX_REQUESTS=100 # number of requests before restarting worker
DJANGO_SETTINGS_MODULE=sapl.settings # which settings file should Django use (*)
DJANGO_WSGI_MODULE=sapl.wsgi # WSGI module name (*)
@ -41,6 +42,7 @@ test -d $RUNDIR || mkdir -p $RUNDIR
exec gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--max-requests $MAX_REQUESTS \
--user $USER \
--access-logfile - \
--error-logfile - \

20
sapl/audiencia/views.py

@ -1,15 +1,10 @@
from django.shortcuts import render
from django.http import HttpResponse
from django.core.urlresolvers import reverse
from django.db.models import F
from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.generic import ListView
from sapl.comissoes.forms import ParticipacaoCreateForm, ParticipacaoEditForm
from sapl.crud.base import RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud
from sapl.materia.models import MateriaLegislativa
from django.views.generic import UpdateView
from sapl.crud.base import RP_DETAIL, RP_LIST, Crud
from .forms import AudienciaForm
from .models import (AudienciaPublica, TipoAudienciaPublica)
from .models import AudienciaPublica
def index(request):
return HttpResponse("Audiência Pública")
@ -36,10 +31,11 @@ class AudienciaCrud(Crud):
form_class = AudienciaForm
def get_initial(self):
self.initial['tipo_materia'] = self.object.materia.tipo.id
self.initial['numero_materia'] = self.object.materia.numero
self.initial['ano_materia'] = self.object.materia.ano
return self.initial
initial = super(UpdateView, self).get_initial()
initial['tipo_materia'] = self.object.materia.tipo.id
initial['numero_materia'] = self.object.materia.numero
initial['ano_materia'] = self.object.materia.ano
return initial
class DeleteView(Crud.DeleteView):
pass

8
sapl/base/forms.py

@ -528,7 +528,8 @@ class RelatorioAtasFilterSet(django_filters.FilterSet):
@property
def qs(self):
parent = super(RelatorioAtasFilterSet, self).qs
return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero')
return parent.distinct().prefetch_related('tipo').exclude(
upload_ata='').order_by('-data_inicio', 'tipo', 'numero')
def __init__(self, *args, **kwargs):
super(RelatorioAtasFilterSet, self).__init__(
@ -729,6 +730,11 @@ class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet):
autoria__autor = django_filters.CharFilter(widget=forms.HiddenInput())
@property
def qs(self):
parent = super(RelatorioMateriasPorAutorFilterSet, self).qs
return parent.distinct().order_by('-ano', '-numero')
class Meta:
model = MateriaLegislativa
fields = ['tipo', 'data_apresentacao']

1
sapl/base/views.py

@ -247,7 +247,6 @@ class RelatorioAtasView(FilterView):
if not self.filterset.form.is_valid():
return context
context['object_list'] = context['object_list'].exclude(upload_ata='')
qr = self.request.GET.copy()
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''

21
sapl/materia/forms.py

@ -162,6 +162,11 @@ class MateriaSimplificadaForm(ModelForm):
class MateriaLegislativaForm(ModelForm):
tipo_autor = ModelChoiceField(label=_('Tipo Autor'),
required=False,
queryset=TipoAutor.objects.all(),
empty_label=_('------'), )
autor = forms.ModelChoiceField(required=False,
empty_label='------',
queryset=Autor.objects.all()
@ -172,6 +177,15 @@ class MateriaLegislativaForm(ModelForm):
exclude = ['texto_articulado', 'autores', 'proposicao',
'anexadas', 'data_ultima_atualizacao']
def __init__(self, *args, **kwargs):
super(MateriaLegislativaForm, self).__init__(*args, **kwargs)
if self.instance and self.instance.pk:
self.fields['tipo_autor'] = forms.CharField(required=False,
widget=forms.HiddenInput())
self.fields['autor'] = forms.CharField(required=False,
widget=forms.HiddenInput())
def clean(self):
super(MateriaLegislativaForm, self).clean()
@ -219,12 +233,17 @@ class MateriaLegislativaForm(ModelForm):
return cleaned_data
def save(self, commit=False):
if not self.instance.pk:
primeiro_autor = True
else:
primeiro_autor = False
materia = super(MateriaLegislativaForm, self).save(commit)
materia.save()
if self.cleaned_data['autor']:
autoria = Autoria()
autoria.primeiro_autor = True
autoria.primeiro_autor = primeiro_autor
autoria.materia = materia
autoria.autor = self.cleaned_data['autor']
autoria.save()

46
sapl/materia/views.py

@ -17,7 +17,7 @@ from django.shortcuts import get_object_or_404, redirect
from django.template import RequestContext, loader
from django.utils import formats, timezone
from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, ListView, TemplateView, UpdateView
from django.views.generic import FormView, ListView, TemplateView, CreateView, UpdateView
from django.views.generic.base import RedirectView
from django.views.generic.edit import FormView
from django_filters.views import FilterView
@ -1013,18 +1013,19 @@ class TramitacaoCrud(MasterDetailCrud):
'pk': self.kwargs['pk']})
def get_initial(self):
initial = super(CreateView, self).get_initial()
local = MateriaLegislativa.objects.get(
pk=self.kwargs['pk']).tramitacao_set.order_by(
'-data_tramitacao',
'-id').first()
if local:
self.initial['unidade_tramitacao_local'
initial['unidade_tramitacao_local'
] = local.unidade_tramitacao_destino.pk
else:
self.initial['unidade_tramitacao_local'] = ''
self.initial['data_tramitacao'] = timezone.now().date()
return self.initial
initial['unidade_tramitacao_local'] = ''
initial['data_tramitacao'] = timezone.now().date()
return initial
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
@ -1154,9 +1155,10 @@ class DocumentoAcessorioCrud(MasterDetailCrud):
super(MasterDetailCrud.CreateView, self).__init__(**kwargs)
def get_initial(self):
self.initial['data'] = timezone.now().date()
initial = super(CreateView, self).get_initial()
initial['data'] = timezone.now().date()
return self.initial
return initial
def get_context_data(self, **kwargs):
context = super(
@ -1283,10 +1285,11 @@ class LegislacaoCitadaCrud(MasterDetailCrud):
form_class = LegislacaoCitadaForm
def get_initial(self):
self.initial['tipo'] = self.object.norma.tipo.id
self.initial['numero'] = self.object.norma.numero
self.initial['ano'] = self.object.norma.ano
return self.initial
initial = super(UpdateView, self).get_initial()
initial['tipo'] = self.object.norma.tipo.id
initial['numero'] = self.object.norma.numero
initial['ano'] = self.object.norma.ano
return initial
class DetailView(MasterDetailCrud.DetailView):
@ -1319,10 +1322,11 @@ class AnexadaCrud(MasterDetailCrud):
form_class = AnexadaForm
def get_initial(self):
self.initial['tipo'] = self.object.materia_anexada.tipo.id
self.initial['numero'] = self.object.materia_anexada.numero
self.initial['ano'] = self.object.materia_anexada.ano
return self.initial
initial = super(UpdateView, self).get_initial()
initial['tipo'] = self.object.materia_anexada.tipo.id
initial['numero'] = self.object.materia_anexada.numero
initial['ano'] = self.object.materia_anexada.ano
return initial
class DetailView(MasterDetailCrud.DetailView):
@ -1344,16 +1348,18 @@ class MateriaAssuntoCrud(MasterDetailCrud):
form_class = MateriaAssuntoForm
def get_initial(self):
self.initial['materia'] = self.kwargs['pk']
return self.initial
initial = super(CreateView, self).get_initial()
initial['materia'] = self.kwargs['pk']
return initial
class UpdateView(MasterDetailCrud.UpdateView):
form_class = MateriaAssuntoForm
def get_initial(self):
self.initial['materia'] = self.get_object().materia
self.initial['assunto'] = self.get_object().assunto
return self.initial
initial = super(UpdateView, self).get_initial()
initial['materia'] = self.get_object().materia
initial['assunto'] = self.get_object().assunto
return initial
class MateriaLegislativaCrud(Crud):

15
sapl/norma/forms.py

@ -83,16 +83,19 @@ class NormaJuridicaForm(ModelForm):
label='Matéria',
required=False,
queryset=TipoMateriaLegislativa.objects.all(),
empty_label='Selecione'
empty_label='Selecione',
widget=forms.Select(attrs={'autocomplete': 'off'})
)
numero_materia = forms.CharField(
label='Número Matéria',
required=False
required=False,
widget=forms.TextInput(attrs={'autocomplete': 'off'})
)
ano_materia = forms.ChoiceField(
label='Ano Matéria',
required=False,
choices=ANO_CHOICES,
widget=forms.Select(attrs={'autocomplete': 'off'})
)
class Meta:
@ -122,7 +125,13 @@ class NormaJuridicaForm(ModelForm):
if not self.is_valid():
return cleaned_data
if not self.instance:
norma = NormaJuridica.objects.filter(ano=cleaned_data['ano'],
numero=cleaned_data['numero'],
tipo=cleaned_data['tipo']).exists()
if norma:
raise ValidationError("Já existe uma norma de mesmo Tipo, Ano "
"e Número no sistema")
if (cleaned_data['tipo_materia'] and
cleaned_data['numero_materia'] and
cleaned_data['ano_materia']):

22
sapl/norma/views.py

@ -7,7 +7,7 @@ from django.http import HttpResponse, JsonResponse
from django.template import RequestContext, loader
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, ListView, TemplateView, UpdateView
from django.views.generic import TemplateView, UpdateView
from django.views.generic.base import RedirectView
from django.views.generic.edit import FormView
from django_filters.views import FilterView
@ -51,11 +51,12 @@ class NormaRelacionadaCrud(MasterDetailCrud):
form_class = NormaRelacionadaForm
def get_initial(self):
self.initial['tipo'] = self.object.norma_relacionada.tipo.id
self.initial['numero'] = self.object.norma_relacionada.numero
self.initial['ano'] = self.object.norma_relacionada.ano
self.initial['ementa'] = self.object.norma_relacionada.ementa
return self.initial
initial = super(UpdateView, self).get_initial()
initial['tipo'] = self.object.norma_relacionada.tipo.id
initial['numero'] = self.object.norma_relacionada.numero
initial['ano'] = self.object.norma_relacionada.ano
initial['ementa'] = self.object.norma_relacionada.ementa
return initial
class DetailView(MasterDetailCrud.DetailView):
@ -171,12 +172,13 @@ class NormaCrud(Crud):
layout_key = 'NormaJuridicaCreate'
def get_initial(self):
initial = super(UpdateView, self).get_initial()
norma = NormaJuridica.objects.get(id=self.kwargs['pk'])
if norma.materia:
self.initial['tipo_materia'] = norma.materia.tipo
self.initial['ano_materia'] = norma.materia.ano
self.initial['numero_materia'] = norma.materia.numero
return self.initial.copy()
initial['tipo_materia'] = norma.materia.tipo
initial['ano_materia'] = norma.materia.ano
initial['numero_materia'] = norma.materia.numero
return initial
def recuperar_norma(request):

2
sapl/parlamentares/forms.py

@ -261,6 +261,8 @@ class FiliacaoForm(ModelForm):
fields = ['partido',
'data',
'data_desfiliacao']
widgets = {'data': forms.DateInput(attrs={'autocomplete': 'off'}),
'data_desfiliacao': forms.DateInput(attrs={'autocomplete': 'off'})}
def clean(self):
super(FiliacaoForm, self).clean()

11
sapl/protocoloadm/views.py

@ -11,7 +11,7 @@ from django.http.response import HttpResponseRedirect
from django.shortcuts import redirect
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, ListView
from django.views.generic import ListView, CreateView
from django.views.generic.base import RedirectView, TemplateView
from django.views.generic.edit import FormView
from django_filters.views import FilterView
@ -610,18 +610,19 @@ class TramitacaoAdmCrud(MasterDetailCrud):
form_class = TramitacaoAdmForm
def get_initial(self):
initial = super(CreateView, self).get_initial()
local = DocumentoAdministrativo.objects.get(
pk=self.kwargs['pk']).tramitacaoadministrativo_set.order_by(
'-data_tramitacao',
'-id').first()
if local:
self.initial['unidade_tramitacao_local'
initial['unidade_tramitacao_local'
] = local.unidade_tramitacao_destino.pk
else:
self.initial['unidade_tramitacao_local'] = ''
self.initial['data_tramitacao'] = timezone.now().date()
return self.initial
initial['unidade_tramitacao_local'] = ''
initial['data_tramitacao'] = timezone.now().date()
return initial
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)

13
sapl/sessao/forms.py

@ -179,15 +179,17 @@ class ExpedienteMateriaForm(ModelForm):
required=True,
queryset=TipoMateriaLegislativa.objects.all(),
empty_label='Selecione',
)
widget=forms.Select(attrs={'autocomplete': 'off'}))
numero_materia = forms.CharField(
label='Número Matéria', required=True)
label='Número Matéria', required=True,
widget=forms.TextInput(attrs={'autocomplete': 'off'}))
ano_materia = forms.CharField(
label='Ano Matéria',
initial=int(data_atual.year),
required=True)
required=True,
widget=forms.TextInput(attrs={'autocomplete': 'off'}))
data_ordem = forms.CharField(
label='Data Sessão',
@ -463,7 +465,6 @@ class OradorExpedienteForm(ModelForm):
def __init__(self, *args, **kwargs):
super(OradorExpedienteForm, self).__init__(*args, **kwargs)
legislatura_vigente = SessaoPlenaria.objects.get(pk=kwargs['initial']['id_sessao']).legislatura
if legislatura_vigente:
@ -480,11 +481,13 @@ class OradorExpedienteForm(ModelForm):
return self.cleaned_data
sessao_id = self.initial['id_sessao']
numero = self.initial.get('numero') # Retorna None se inexistente
ordem = OradorExpediente.objects.filter(
sessao_plenaria_id=sessao_id,
numero_ordem=cleaned_data['numero_ordem']
).exists()
if ordem:
if ordem and (cleaned_data['numero_ordem'] != numero):
raise ValidationError(_(
'Já existe orador nesta posição da ordem de pronunciamento'))

57
sapl/sessao/views.py

@ -16,7 +16,7 @@ from django.utils.decorators import method_decorator
from django.utils.html import strip_tags
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import FormView, ListView, TemplateView
from django.views.generic import FormView, ListView, TemplateView, CreateView, UpdateView
from django.views.generic.base import RedirectView
from django.views.generic.detail import DetailView
from django.views.generic.edit import FormMixin
@ -329,6 +329,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente):
resultado_descricao,
resultado_observacao))
else:
if obj.tipo_votacao == 2:
if is_expediente:
url = reverse(
@ -351,12 +352,8 @@ def customize_link_materia(context, pk, has_permission, is_expediente):
(url,
resultado_descricao,
resultado_observacao))
else:
resultado = ('%s<br/>%s' %
(resultado_descricao,
resultado_observacao))
if obj.tipo_votacao == 1:
elif obj.tipo_votacao == 1:
if is_expediente:
url = reverse(
'sapl.sessao:votacao_simbolica_transparencia',
@ -375,9 +372,9 @@ def customize_link_materia(context, pk, has_permission, is_expediente):
'?&materia=ordem'
resultado = ('<a href="%s">%s<br/>%s</a>' %
(url,
resultado_descricao,
resultado_observacao))
(url,
resultado_descricao,
resultado_observacao))
else:
resultado = ('%s<br/>%s' %
(resultado_descricao,
@ -385,7 +382,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente):
context['rows'][i][3] = (resultado, None)
return context
def get_presencas_generic(model, sessao, legislatura):
presencas = model.objects.filter(
sessao_plenaria=sessao)
@ -435,10 +432,11 @@ class MateriaOrdemDiaCrud(MasterDetailCrud):
form_class = OrdemDiaForm
def get_initial(self):
self.initial['tipo_materia'] = self.object.materia.tipo.id
self.initial['numero_materia'] = self.object.materia.numero
self.initial['ano_materia'] = self.object.materia.ano
return self.initial
initial = super(UpdateView, self).get_initial()
initial['tipo_materia'] = self.object.materia.tipo.id
initial['numero_materia'] = self.object.materia.numero
initial['ano_materia'] = self.object.materia.ano
return initial
class DetailView(MasterDetailCrud.DetailView):
@ -492,14 +490,15 @@ class ExpedienteMateriaCrud(MasterDetailCrud):
form_class = ExpedienteMateriaForm
def get_initial(self):
self.initial['data_ordem'] = SessaoPlenaria.objects.get(
initial = super(CreateView, self).get_initial()
initial['data_ordem'] = SessaoPlenaria.objects.get(
pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y')
max_numero_ordem = ExpedienteMateria.objects.filter(
sessao_plenaria=self.kwargs['pk']).aggregate(
Max('numero_ordem'))['numero_ordem__max']
self.initial['numero_ordem'] = (
initial['numero_ordem'] = (
max_numero_ordem if max_numero_ordem else 0) + 1
return self.initial
return initial
def get_success_url(self):
return reverse('sapl.sessao:expedientemateria_list',
@ -509,10 +508,11 @@ class ExpedienteMateriaCrud(MasterDetailCrud):
form_class = ExpedienteMateriaForm
def get_initial(self):
self.initial['tipo_materia'] = self.object.materia.tipo.id
self.initial['numero_materia'] = self.object.materia.numero
self.initial['ano_materia'] = self.object.materia.ano
return self.initial
initial = super(UpdateView, self).get_initial()
initial['tipo_materia'] = self.object.materia.tipo.id
initial['numero_materia'] = self.object.materia.numero
initial['ano_materia'] = self.object.materia.ano
return initial
class DetailView(MasterDetailCrud.DetailView):
@ -544,6 +544,14 @@ class OradorExpedienteCrud(OradorCrud):
kwargs={'pk': self.kwargs['pk']})
class UpdateView(MasterDetailCrud.UpdateView):
form_class = OradorExpedienteForm
def get_initial(self):
return {'id_sessao': self.object.sessao_plenaria.id,
'numero': self.object.numero_ordem}
class OradorCrud(OradorCrud):
model = Orador
@ -1146,9 +1154,10 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView):
return reverse('sapl.base:sistema')
def get_initial(self):
initial = super(ResumoOrdenacaoView, self).get_initial()
ordenacao = ResumoOrdenacao.objects.first()
if ordenacao:
return {'primeiro': ordenacao.primeiro,
initial.update({'primeiro': ordenacao.primeiro,
'segundo': ordenacao.segundo,
'terceiro': ordenacao.terceiro,
'quarto': ordenacao.quarto,
@ -1157,8 +1166,8 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView):
'setimo': ordenacao.setimo,
'oitavo': ordenacao.oitavo,
'nono': ordenacao.nono,
'decimo': ordenacao.decimo}
return self.initial.copy()
'decimo': ordenacao.decimo})
return initial
def form_valid(self, form):
ordenacao = ResumoOrdenacao.objects.get_or_create()[0]

2
sapl/templates/materia/layouts.yaml

@ -23,7 +23,7 @@ MateriaLegislativa:
{% trans 'Identificação Básica' %}:
- tipo ano numero
- data_apresentacao numero_protocolo tipo_apresentacao
- autor
- tipo_autor autor
- texto_original
{% trans 'Outras Informações' %}:
- apelido dias_prazo polemica

38
sapl/templates/materia/materialegislativa_form.html

@ -22,6 +22,44 @@
}
}
$("#id_tipo, #id_ano").change(recuperar_numero_ano);
function compare(a, b) {
if (a.text < b.text)
return -1;
if (a.text > b.text)
return 1;
return 0;
}
$(document).ready(function() {
$("#id_tipo_autor").change(function() {
var tipo_selecionado = $("#id_tipo_autor").val();
var autor_selecionado = $("#id_autor").val();
$("#id_autor option").remove()
if (tipo_selecionado !== undefined && tipo_selecionado !== null) {
var json_data = {
tipo : tipo_selecionado,
data_relativa : $("#id_data_apresentacao").val()
}
$.getJSON("/api/autor/possiveis", json_data, function(data){
if (data) {
var results = data.sort(compare);
if (results.length > 1) {
$("#id_autor").append("<option>-----</option>");
}
$.each(results, function(idx, obj) {
$("#id_autor")
.append($("<option></option>")
.attr("value", obj.value)
.text(obj.text));
});
$("#id_autor").val(autor_selecionado);
}
});
}
});
$("#id_tipo_autor").trigger('change');
});
</script>
{% endblock %}

21
sapl/templates/painel/index.html

@ -57,7 +57,7 @@
</table>
<div class="center">
<img src="" id="logo-painel" alt="" width="100%"/>
<img src="" id="logo-painel" alt="" width="50%"/>
</div>
<h2><font color="red"><p align="center"><span id="message"></span></p></font></h2>
@ -290,9 +290,15 @@
$('#oradores_list').append(
'<center>A listagem de oradores só aparecerá quando o painel estiver aberto.</center>')
oradores.append('</span>');
votacao.append('<span id="votacao">');
$("#votacao").append('<center>A votação só aparecerá quando o painel estiver aberto</center>');
votacao.append('</span>');
}
if (data['materia_legislativa_texto']){
if (data['materia_legislativa_texto'] && data["status_painel"] == true){
var votacao = $("#votacao")
@ -366,16 +372,21 @@
}
if (data['materia_legislativa_texto']){
$("#materia_legislativa_texto").text(data["materia_legislativa_texto"]);
if (data["status_painel"] == true){
$("#materia_legislativa_texto").text(data["materia_legislativa_texto"]);
}
else{
$("#materia_legislativa_texto").text('A Matéria em votação só aparecerá quando o painel estiver aberto');
}
}
else{
$("#materia_legislativa_texto").text('Não há nehuma matéria votada ou para votação');
}
if (data['observacao_materia']){
if (data['observacao_materia'] && data["status_painel"] == true){
var texto = data['observacao_materia'];
if(texto.length > 151) {
$("#observacao_materia").text(texto.substr(0, 145).concat('(...)'));
$("#observacao_materia").text(texto.substr(0, 145).concat('(...)'));
}
else{
$("#observacao_materia").text(texto);

10
sapl/templates/protocoloadm/comprovante.html

@ -61,14 +61,14 @@
<th>Data / Horário</th>
<td>{{ protocolo.data|date:"d/m/Y" }} - {{ protocolo.timestamp|date:"H:i:s" }}</td>
</tr>
{% if protocolo.tipo_processo == 0 %}
{% if protocolo.tipo_processo == 1 %}
<tr>
<th>Ementa</th>
<td>{{ protocolo.assunto_ementa }}</td>
</tr>
<tr>
<th>Interessado</th>
<td>{{ protocolo.interessado }}</td>
<th>Autor</th>
<td>{{ protocolo.autor }}</td>
</tr>
{% endif %}
<tr>
@ -85,5 +85,9 @@
<th>Número Páginas</th>
<td>{{ protocolo.numero_paginas }}</td>
</tr>
<tr>
<th>Comprovante emitido por</th>
<td>{{ request.user.username }}</td>
</tr>
</table>
{% endblock detail_content %}

2
setup.py

@ -49,7 +49,7 @@ install_requires = [
]
setup(
name='interlegis-sapl',
version='3.1.81',
version='3.1.87',
packages=find_packages(),
include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',

Loading…
Cancel
Save