Browse Source

Casas com DateRangeFilter e melhor organização do admin

revisaoSidenav
Sesostris Vieira 3 years ago
parent
commit
14edb0b1a6
  1. 155
      sigi/apps/casas/admin.py
  2. 8
      sigi/apps/casas/models.py
  3. 1
      sigi/apps/casas/templates/admin/casas/change_form.html
  4. 164
      sigi/apps/casas/templates/admin/casas/convenios_inline.html
  5. 164
      sigi/apps/casas/templates/admin/casas/ocorrencia_inline.html

155
sigi/apps/casas/admin.py

@ -18,8 +18,9 @@ from sigi.apps.casas.filters import (GerentesInterlegisFilter, ConvenioFilter,
ExcluirConvenioFilter)
from sigi.apps.contatos.models import Telefone
from sigi.apps.convenios.models import Convenio, Projeto
# from sigi.apps.ocorrencias.models import Ocorrencia
# from sigi.apps.servicos.models import Servico, TipoServico
from sigi.apps.ocorrencias.models import Ocorrencia
from sigi.apps.servicos.models import Servico, TipoServico
from sigi.apps.servicos.filters import ServicoAtivoFilter
from sigi.apps.utils import field_label, queryset_ascii
from sigi.apps.utils.mixins import CartExportReportMixin, LabeledResourse
@ -143,10 +144,9 @@ class ConveniosInline(admin.TabularInline):
'data_retorno_sem_assinatura', 'get_anexos']
extra = 0
can_delete = False
template = 'admin/casas/convenios_inline.html'
ordering = ('-data_retorno_assinatura',)
def has_add_permission(self, request):
def has_add_permission(self, request, obj):
return False
def get_anexos(self, obj):
@ -176,16 +176,11 @@ class ConveniosInline(admin.TabularInline):
def link_convenio(self, obj):
if obj.pk is None:
return ""
url = reverse(
f'admin:{obj._meta.app_label}_{obj._meta.module_name}_change',
args=[obj.pk]
) + '?_popup=1'
opts = self.opts
url = reverse(f"admin:{opts.app_label}_{opts.model_name}_change",
args=[obj.pk])
return mark_safe(
f'<input id="edit_convenio-{obj.pk}" type="hidden"/>'
f'<a id="lookup_edit_convenio-{obj.pk}" href="{url}"'
'class="changelink" '
'onclick="return showRelatedObjectLookupPopup(this)">'
f'{_("Editar")}</a>'
f'<a href="{url}"><i class="material-icons Tiny">edit</i></a>'
)
link_convenio.short_description = _('Editar convenio')
@ -195,72 +190,64 @@ class ConveniosInline(admin.TabularInline):
return mark_safe(obj.get_sigad_url())
link_sigad.short_description = _("Processo no Senado")
# class ServicoInline(admin.TabularInline):
# model = Servico
# fields = ('link_url', 'contato_tecnico', 'contato_administrativo',
# 'hospedagem_interlegis', 'data_ativacao', 'data_alteracao',
# 'data_desativacao', 'link_servico')
# readonly_fields = ['link_url', 'contato_tecnico', 'contato_administrativo',
# 'hospedagem_interlegis', 'data_ativacao',
# 'data_alteracao', 'data_desativacao', 'link_servico']
# extra = 0
# max_num = 0
# can_delete = False
# ordering = ('-data_alteracao',)
# def link_url(self, servico):
# if servico.data_desativacao is not None:
# return servico.url
# return mark_safe(
# f'<a href="{servico.url}" target="_blank">{servico.url}</a>'
# )
# link_url.short_description = _('URL do serviço')
# def link_servico(self, obj):
# if obj.pk is None:
# return ""
# url = reverse(
# f'admin:{obj._meta.app_label}_{obj._meta.module_name_change}',
# args=[obj.pk]
# ) + '?_popup=1'
# return mark_safe(
# f'<input id="edit_convenio-{obj.pk}" type="hidden"/>'
# f'<a id="lookup_edit_convenio-{obj.pk}" href="{url}" '
# 'class="changelink" '
# 'onclick="return showRelatedObjectLookupPopup(this)">Editar</a>'
# )
# link_servico.short_description = _('Editar Serviço')
# def has_add_permission(self, request):
# return False
# class OcorrenciaInline(admin.TabularInline):
# model = Ocorrencia
# fields = ('data_criacao', 'assunto', 'prioridade', 'status',
# 'data_modificacao', 'setor_responsavel', 'link_editar',)
# readonly_fields = ('data_criacao', 'assunto', 'prioridade', 'status',
# 'data_modificacao', 'setor_responsavel', 'link_editar',)
# extra = 0
# max_num = 0
# can_delete = False
# template = 'admin/casas/ocorrencia_inline.html'
# ordering = ('-data_modificacao',)
# def link_editar(self, obj):
# if obj.pk is None:
# return ""
# url = reverse(
# f'admin:{obj._meta.app_label}_{obj._meta.module_name}_change',
# args=[obj.pk]
# )
# return mark_safe(
# f'<input id="edit_ocorrencia-{obj.pk}" type="hidden"/>'
# f'<a id="lookup_edit_ocorrencia-{obj.pk}" href="{url}" '
# 'class="button" target="_blank" '
# 'onclick="return showRelatedObjectLookupPopup(this);">'
# f'{_("Editar")}</a>'
# )
# link_editar.short_description = _('Editar')
class ServicoInline(admin.TabularInline):
model = Servico
fields = ('link_url', 'contato_tecnico', 'contato_administrativo',
'hospedagem_interlegis', 'data_ativacao', 'data_alteracao',
'data_desativacao', 'link_servico')
readonly_fields = ['link_url', 'contato_tecnico', 'contato_administrativo',
'hospedagem_interlegis', 'data_ativacao',
'data_alteracao', 'data_desativacao', 'link_servico']
extra = 0
max_num = 0
can_delete = False
ordering = ('-data_alteracao',)
def link_url(self, servico):
if servico.data_desativacao is not None:
return servico.url
return mark_safe(
f'<a href="{servico.url}" target="_blank">{servico.url}</a>'
)
link_url.short_description = _('URL do serviço')
def link_servico(self, obj):
if obj.pk is None:
return ""
opts = self.opts
url = reverse(f'admin:{opts.app_label}_{opts.model_name}_change',
args=[obj.pk])
return mark_safe(
f'<a href="{url}"><i class="material-icons Tiny">edit</i></a>'
)
link_servico.short_description = _('Editar Serviço')
def has_add_permission(self, request, obj):
return False
class OcorrenciaInline(admin.TabularInline):
model = Ocorrencia
fields = ('data_criacao', 'assunto', 'prioridade', 'status',
'data_modificacao', 'setor_responsavel', 'link_editar',)
readonly_fields = ('data_criacao', 'assunto', 'prioridade', 'status',
'data_modificacao', 'setor_responsavel', 'link_editar',)
extra = 0
max_num = 0
can_delete = False
ordering = ('-data_modificacao',)
def link_editar(self, obj):
if obj.pk is None:
return ""
opts = self.opts
url = reverse(
f'admin:{opts.app_label}_{opts.model_name}_change',
args=[obj.pk]
)
return mark_safe(
f'<a href="{url}"><i class="material-icons Tiny">edit</i></a>'
)
link_editar.short_description = _('Editar')
@admin.register(Orgao)
@ -268,8 +255,8 @@ class OrgaoAdmin(CartExportReportMixin, admin.ModelAdmin):
form = OrgaoForm
resource_class = OrgaoExportResourse
inlines = (TelefonesInline, PresidenteInline, ContatoInterlegisInline,
FuncionariosInline, ) #ConveniosInline, ServicoInline,
# OcorrenciaInline,)
FuncionariosInline, ConveniosInline, ServicoInline,
OcorrenciaInline,)
list_display = ('id', 'sigla', 'nome', 'get_uf', 'get_gerentes',
'get_convenios', 'get_servicos')
list_display_links = ('sigla', 'nome',)
@ -278,6 +265,7 @@ class OrgaoAdmin(CartExportReportMixin, admin.ModelAdmin):
# ExcluirConvenioFilter, ServicoFilter, 'inclusao_digital',)
list_filter = ('tipo', ('gerentes_interlegis', GerentesInterlegisFilter),
'municipio__uf__nome', ConvenioFilter, ExcluirConvenioFilter,
('servico__data_desativacao', ServicoAtivoFilter),
'inclusao_digital',)
ordering = ('municipio__uf__nome', 'nome')
queryset = queryset_ascii
@ -295,8 +283,7 @@ class OrgaoAdmin(CartExportReportMixin, admin.ModelAdmin):
'pagina_web', 'email', 'obs_pesquisa',)
}),
(_('Outras informações'), {
'fields': ('observacoes', 'horario_funcionamento', 'foto',
'recorte'),
'fields': ('observacoes', 'horario_funcionamento', 'foto',),
}),
)
raw_id_fields = ('municipio',)
@ -387,7 +374,7 @@ class OrgaoAdmin(CartExportReportMixin, admin.ModelAdmin):
content_type='application/pdf',
)
relatorio_simples.title = _('Relatório Simples')
def relatorio_completo(self, request):
context = {
'casas': self.get_queryset(request).order_by('municipio__uf','nome'),

8
sigi/apps/casas/models.py

@ -148,11 +148,9 @@ class Orgao(models.Model):
@property
def num_parlamentares(self):
# TODO: Descomentar assim que a app Parlamentares for migrada
# if not self.legislatura_set.exists():
# return 0
# return self.legislatura_set.latest('data_inicio').total_parlamentares
return 0
if not self.legislatura_set.exists():
return 0
return self.legislatura_set.latest('data_inicio').total_parlamentares
@property
def telefone(self):

1
sigi/apps/casas/templates/admin/casas/change_form.html

@ -1 +0,0 @@
{% extends "change_form_with_report_and_labels.html" %}

164
sigi/apps/casas/templates/admin/casas/convenios_inline.html

@ -1,164 +0,0 @@
{% load i18n admin_static admin_modify bootstrapped_goodies_tags %}
<div class="_inline-group" id="{{ inline_admin_formset.formset.prefix }}-group">
<div class="tabular inline-related {% if forloop.last %}last-related{% endif %}">
{{ inline_admin_formset.formset.management_form }}
<fieldset class="module">
<h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
{{ inline_admin_formset.formset.non_form_errors }}
<table class="table table-striped table-bordered">
<thead><tr>
{% for field in inline_admin_formset.fields %}
{% if not field.widget.is_hidden %}
<th{% if forloop.first %} colspan="2"{% endif %}{% if field.required %} class="required"{% endif %}>{{ field.label|capfirst }}
{% if field.help_text %}<i class="glyphicon glyphicon-comment help help-tooltip" style="margin-left: 4px;" alt="({{ field.help_text|striptags }})" title="{{ field.help_text|striptags }}"></i>{% endif %}
</th>
{% endif %}
{% endfor %}
{% if inline_admin_formset.formset.can_delete %}<th>{% trans "Delete?" %}</th>{% endif %}
</tr></thead>
<tbody>
{% for inline_admin_form in inline_admin_formset %}
{% if inline_admin_form.form.non_field_errors %}
<tr><td colspan="{{ inline_admin_form|cell_count }}">{{ inline_admin_form.form.non_field_errors }}</td></tr>
{% endif %}
<tr class="form-row {% cycle "row1" "row2" %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last %} empty-form{% endif %}"
id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
<td class="original">
{% if inline_admin_formset.opts.sortable_field_name %}
<span class="btn btn-default btn-xs drag-handler pull-left"><i class="glyphicon glyphicon-move"></i></span>
{% endif %}
{% if inline_admin_form.original or inline_admin_form.show_url %}<p>
{% if inline_admin_form.original %} {{ inline_admin_form.original }}{% endif %}
{% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.id }}/">{% trans "View on site" %}</a>{% endif %}
</p>{% endif %}
{% if inline_admin_form.has_auto_field or inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
{{ inline_admin_form.fk_field.field }}
{% spaceless %}
{% for fieldset in inline_admin_form %}
{% for line in fieldset %}
{% for field in line %}
{% if field.is_hidden %} {{ field.field }} {% endif %}
{% endfor %}
{% endfor %}
{% endfor %}
{% endspaceless %}
</td>
{% for fieldset in inline_admin_form %}
{% for line in fieldset %}
{% for field in line %}
<td{% if field.field.name %} class="field-{{ field.field.name }}"{% endif %}>
{% if field.is_readonly %}
<p>{{ field.contents }}</p>
{% else %}
{% if field.errors %}
<div class="alert alert-danger">{{ field.errors|striptags }}</div>
{% endif %}
{% dab_field_rendering field.field %}
{% endif %}
</td>
{% endfor %}
{% endfor %}
{% endfor %}
{% if inline_admin_formset.formset.can_delete %}
<td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
{% endif %}
</tr>
{% endfor %}
<tr><td colspan="100">
<a href="{% url 'admin:convenios_convenio_add' %}?casa_legislativa={{original.pk|safe}}">
<span class="glyphicon glyphicon-plus"></span>{% blocktrans with inline_admin_formset.opts.verbose_name|capfirst as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}
</a>
</td></tr>
</tbody>
</table>
</fieldset>
</div>
</div>
<script type="text/javascript">
(function($) {
$(document).ready(function($) {
var rows = "#{{ inline_admin_formset.formset.prefix }}-group .tabular.inline-related tbody tr";
var alternatingRows = function(row) {
$(rows).not(".add-row").removeClass("row1 row2")
.filter(":even").addClass("row1").end()
.filter(rows + ":odd").addClass("row2");
}
var reinitDateTimeShortCuts = function() {
// Reinitialize the calendar and clock widgets by force
if (typeof DateTimeShortcuts != "undefined") {
$(".datetimeshortcuts").remove();
DateTimeShortcuts.init();
}
}
var updateSelectFilter = function() {
// If any SelectFilter widgets are a part of the new form,
// instantiate a new SelectFilter instance for it.
if (typeof SelectFilter != "undefined"){
$(".selectfilter").each(function(index, value){
var namearr = value.name.split('-');
SelectFilter.init(value.id, namearr[namearr.length-1], false, "{% static "admin/" %}");
});
$(".selectfilterstacked").each(function(index, value){
var namearr = value.name.split('-');
SelectFilter.init(value.id, namearr[namearr.length-1], true, "{% static "admin/" %}");
});
}
}
var initPrepopulatedFields = function(row) {
row.find('.prepopulated_field').each(function() {
var field = $(this);
var input = field.find('input, select, textarea');
var dependency_list = input.data('dependency_list') || [];
var dependencies = [];
$.each(dependency_list, function(i, field_name) {
dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id'));
});
if (dependencies.length) {
input.prepopulate(dependencies, input.attr('maxlength'));
}
});
}
$(rows).formset({
prefix: "{{ inline_admin_formset.formset.prefix }}",
addText: "{% blocktrans with verbose_name=inline_admin_formset.opts.verbose_name|title %}Add another {{ verbose_name }}{% endblocktrans %}",
formCssClass: "dynamic-{{ inline_admin_formset.formset.prefix }}",
deleteCssClass: "inline-deletelink",
deleteText: "{% trans "Remove" %}",
emptyCssClass: "empty-form",
removed: alternatingRows,
added: (function(row) {
initPrepopulatedFields(row);
reinitDateTimeShortCuts();
updateSelectFilter();
alternatingRows(row);
})
});
});
})(django.jQuery);
// listener for jquery 1.7.2
(function($) {
{% if inline_admin_formset.opts.sortable_field_name %}
$('tbody').sortable({
// items: '.dynamic-{{ inline_admin_formset.formset.prefix }}',
handle: '.drag-handler',
items: ".form-row"
});
$("#{{ opts.model_name }}_form").submit(function(e) {
var sortable_field_name = "{{ inline_admin_formset.opts.sortable_field_name }}",
i = 0;
var initial_form_count = $('#id_{{ inline_admin_formset.formset.prefix }}-INITIAL_FORMS').val();
$('#{{ inline_admin_formset.formset.prefix }}-group table > tbody').find(".form-row").each(function(i, e) {
// make sure we don't assign a position unless extra has been moved
if ($(this).find("input[name$='" + sortable_field_name + "']").val() || (i <= initial_form_count - 1 )) {
$(this).find("input[name$='" + sortable_field_name + "']").val(i);
i++;
}
});
});
{% endif %}
})(jQuery);
</script>

164
sigi/apps/casas/templates/admin/casas/ocorrencia_inline.html

@ -1,164 +0,0 @@
{% load i18n admin_static admin_modify bootstrapped_goodies_tags %}
<div class="_inline-group" id="{{ inline_admin_formset.formset.prefix }}-group">
<div class="tabular inline-related {% if forloop.last %}last-related{% endif %}">
{{ inline_admin_formset.formset.management_form }}
<fieldset class="module">
<h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
{{ inline_admin_formset.formset.non_form_errors }}
<table class="table table-striped table-bordered">
<thead><tr>
{% for field in inline_admin_formset.fields %}
{% if not field.widget.is_hidden %}
<th{% if forloop.first %} colspan="2"{% endif %}{% if field.required %} class="required"{% endif %}>{{ field.label|capfirst }}
{% if field.help_text %}<i class="glyphicon glyphicon-comment help help-tooltip" style="margin-left: 4px;" alt="({{ field.help_text|striptags }})" title="{{ field.help_text|striptags }}"></i>{% endif %}
</th>
{% endif %}
{% endfor %}
{% if inline_admin_formset.formset.can_delete %}<th>{% trans "Delete?" %}</th>{% endif %}
</tr></thead>
<tbody>
{% for inline_admin_form in inline_admin_formset %}
{% if inline_admin_form.form.non_field_errors %}
<tr><td colspan="{{ inline_admin_form|cell_count }}">{{ inline_admin_form.form.non_field_errors }}</td></tr>
{% endif %}
<tr class="form-row {% cycle "row1" "row2" %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last %} empty-form{% endif %}"
id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
<td class="original">
{% if inline_admin_formset.opts.sortable_field_name %}
<span class="btn btn-default btn-xs drag-handler pull-left"><i class="glyphicon glyphicon-move"></i></span>
{% endif %}
{% if inline_admin_form.original or inline_admin_form.show_url %}<p>
{% if inline_admin_form.original %} {{ inline_admin_form.original }}{% endif %}
{% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.id }}/">{% trans "View on site" %}</a>{% endif %}
</p>{% endif %}
{% if inline_admin_form.has_auto_field or inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
{{ inline_admin_form.fk_field.field }}
{% spaceless %}
{% for fieldset in inline_admin_form %}
{% for line in fieldset %}
{% for field in line %}
{% if field.is_hidden %} {{ field.field }} {% endif %}
{% endfor %}
{% endfor %}
{% endfor %}
{% endspaceless %}
</td>
{% for fieldset in inline_admin_form %}
{% for line in fieldset %}
{% for field in line %}
<td{% if field.field.name %} class="field-{{ field.field.name }}"{% endif %}>
{% if field.is_readonly %}
<p>{{ field.contents }}</p>
{% else %}
{% if field.errors %}
<div class="alert alert-danger">{{ field.errors|striptags }}</div>
{% endif %}
{% dab_field_rendering field.field %}
{% endif %}
</td>
{% endfor %}
{% endfor %}
{% endfor %}
{% if inline_admin_formset.formset.can_delete %}
<td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
{% endif %}
</tr>
{% endfor %}
<tr><td colspan="100">
<a href="{% url 'admin:ocorrencias_ocorrencia_add' %}?casa_legislativa={{original.pk|safe}}">
<span class="glyphicon glyphicon-plus"></span>{% blocktrans with inline_admin_formset.opts.verbose_name|capfirst as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}
</a>
</td></tr>
</tbody>
</table>
</fieldset>
</div>
</div>
<script type="text/javascript">
(function($) {
$(document).ready(function($) {
var rows = "#{{ inline_admin_formset.formset.prefix }}-group .tabular.inline-related tbody tr";
var alternatingRows = function(row) {
$(rows).not(".add-row").removeClass("row1 row2")
.filter(":even").addClass("row1").end()
.filter(rows + ":odd").addClass("row2");
}
var reinitDateTimeShortCuts = function() {
// Reinitialize the calendar and clock widgets by force
if (typeof DateTimeShortcuts != "undefined") {
$(".datetimeshortcuts").remove();
DateTimeShortcuts.init();
}
}
var updateSelectFilter = function() {
// If any SelectFilter widgets are a part of the new form,
// instantiate a new SelectFilter instance for it.
if (typeof SelectFilter != "undefined"){
$(".selectfilter").each(function(index, value){
var namearr = value.name.split('-');
SelectFilter.init(value.id, namearr[namearr.length-1], false, "{% static "admin/" %}");
});
$(".selectfilterstacked").each(function(index, value){
var namearr = value.name.split('-');
SelectFilter.init(value.id, namearr[namearr.length-1], true, "{% static "admin/" %}");
});
}
}
var initPrepopulatedFields = function(row) {
row.find('.prepopulated_field').each(function() {
var field = $(this);
var input = field.find('input, select, textarea');
var dependency_list = input.data('dependency_list') || [];
var dependencies = [];
$.each(dependency_list, function(i, field_name) {
dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id'));
});
if (dependencies.length) {
input.prepopulate(dependencies, input.attr('maxlength'));
}
});
}
$(rows).formset({
prefix: "{{ inline_admin_formset.formset.prefix }}",
addText: "{% blocktrans with verbose_name=inline_admin_formset.opts.verbose_name|title %}Add another {{ verbose_name }}{% endblocktrans %}",
formCssClass: "dynamic-{{ inline_admin_formset.formset.prefix }}",
deleteCssClass: "inline-deletelink",
deleteText: "{% trans "Remove" %}",
emptyCssClass: "empty-form",
removed: alternatingRows,
added: (function(row) {
initPrepopulatedFields(row);
reinitDateTimeShortCuts();
updateSelectFilter();
alternatingRows(row);
})
});
});
})(django.jQuery);
// listener for jquery 1.7.2
(function($) {
{% if inline_admin_formset.opts.sortable_field_name %}
$('tbody').sortable({
// items: '.dynamic-{{ inline_admin_formset.formset.prefix }}',
handle: '.drag-handler',
items: ".form-row"
});
$("#{{ opts.model_name }}_form").submit(function(e) {
var sortable_field_name = "{{ inline_admin_formset.opts.sortable_field_name }}",
i = 0;
var initial_form_count = $('#id_{{ inline_admin_formset.formset.prefix }}-INITIAL_FORMS').val();
$('#{{ inline_admin_formset.formset.prefix }}-group table > tbody').find(".form-row").each(function(i, e) {
// make sure we don't assign a position unless extra has been moved
if ($(this).find("input[name$='" + sortable_field_name + "']").val() || (i <= initial_form_count - 1 )) {
$(this).find("input[name$='" + sortable_field_name + "']").val(i);
i++;
}
});
});
{% endif %}
})(jQuery);
</script>
Loading…
Cancel
Save