Browse Source

Add exports (pdf/csv/json) to Event calendar and Staff allocation reports

stable/2.1
Sesostris Vieira 9 years ago
parent
commit
3f52a186a0
  1. 21
      sigi/apps/eventos/templates/eventos/alocacao_equipe.html
  2. 63
      sigi/apps/eventos/templates/eventos/alocacao_equipe_pdf.html
  3. 17
      sigi/apps/eventos/templates/eventos/alocacao_equipe_snippet.html
  4. 64
      sigi/apps/eventos/templates/eventos/calendario.html
  5. 59
      sigi/apps/eventos/templates/eventos/calendario_pdf.html
  6. 68
      sigi/apps/eventos/templates/eventos/calendario_snippet.html
  7. 28
      sigi/apps/eventos/views.py

21
sigi/apps/eventos/templates/eventos/alocacao_equipe.html

@ -28,24 +28,11 @@
{% if next_button %} {% if next_button %}
<li><a href="?ano={{ next_button.ano|safe }}">{% trans "Próximo ano" %}</a></li> <li><a href="?ano={{ next_button.ano|safe }}">{% trans "Próximo ano" %}</a></li>
{% endif %} {% endif %}
<li><a href="?ano={{ ano_pesquisa|safe }}&fmt=pdf" target="_blank">{% trans "Exportar para PDF" %}</a></li>
<li><a href="?ano={{ ano_pesquisa|safe }}&fmt=csv">{% trans "Exportar para CSV" %}</a></li>
<li><a href="?ano={{ ano_pesquisa|safe }}&fmt=json" target="_blank">{% trans "Exportar para Json" %}</a></li>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="table-responsive"> {% include "eventos/alocacao_equipe_snippet.html" %}
<table class="table table-condensed table-bordered">
{% for linha in linhas %}
<tr>
{% if forloop.first %}
{% for coluna in linha %}
<th>{{ coluna }}</th>
{% endfor %}
{% else %}
{% for coluna in linha %}
<td>{{ coluna }}</td>
{% endfor %}
{% endif %}
</tr>
{% endfor %}
</table>
</div>
{% endblock %} {% endblock %}

63
sigi/apps/eventos/templates/eventos/alocacao_equipe_pdf.html

@ -0,0 +1,63 @@
{% extends "base_report.html" %}
{% load static from staticfiles %}
{% load i18n %}
{% block extra_head %}
<style>
@page {
size: A4 landscape;
margin: 1cm;
}
* { font-size: 10px;}
a {
color: black;
text-decoration: none;
}
dt {
font-weight: 700;
}
dd {
margin-left: 2mm;
}
table, th, td {
border: 1px solid #ddd;
}
table {
border-collapse: collapse;
}
th {
text-align: center;
vertical-align: bottom;
background-color: #f1f1f1;
}
td {
width: 6%;
}
td, th {
padding: 2px;
vertical-align: center;
}
td:first-child { width: 22%; font-weight: bolder; }
td:last-child { font-weight: bolder; }
</style>
<title>{% blocktrans %}Alocação de equipe em {{ ano_pesquisa }}{% endblocktrans %}</title>
{% endblock %}
{% block report %}
<h1>{% blocktrans %}Alocação de equipe em {{ ano_pesquisa }}{% endblocktrans %}</h1>
{% include "eventos/alocacao_equipe_snippet.html" %}
{% endblock %}
</body>
</html>

17
sigi/apps/eventos/templates/eventos/alocacao_equipe_snippet.html

@ -0,0 +1,17 @@
<div class="table-responsive">
<table class="table table-condensed table-bordered" repeat="1">
{% for linha in linhas %}
<tr>
{% if forloop.first %}
{% for coluna in linha %}
<th>{{ coluna }}</th>
{% endfor %}
{% else %}
{% for coluna in linha %}
<td>{{ coluna }}</td>
{% endfor %}
{% endif %}
</tr>
{% endfor %}
</table>
</div>

64
sigi/apps/eventos/templates/eventos/calendario.html

@ -35,69 +35,9 @@
{% if next_button %} {% if next_button %}
<li><a href="?mes={{ next_button.mes|safe }}&ano={{ next_button.ano|safe }}">{% trans "Próximo mês" %}</a></li> <li><a href="?mes={{ next_button.mes|safe }}&ano={{ next_button.ano|safe }}">{% trans "Próximo mês" %}</a></li>
{% endif %} {% endif %}
<li><a href="?mes={{ mes_pesquisa|safe }}&ano={{ ano_pesquisa|safe }}&fmt=pdf" target="_blank">{% trans "Exportar para PDF" %}</a></li>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="table-responsive"> {% include "eventos/calendario_snippet.html" %}
<table class="table table-condensed table-bordered">
<tr>
{% for d in dates %}
<th>{{ d|date:'D' }}</th>
{% endfor %}
</tr>
{% for d in dates %}
<th>{% ifchanged d|date:'b' %}{{ d|date:'b' }}<br/>{% endifchanged %}{{ d|date:'j' }}</th>
{% endfor %}
</tr>
{% for linha in linhas %}
<tr>
{% for evento in linha %}
{% if evento.start > 0 %}
<td colspan="{{ evento.start }}">&nbsp;</td>
{% endif %}
<td colspan="{{ evento.duration }}" class="status-{{ evento.evento.status }}">
<h5><a href="{% url 'admin:eventos_evento_change' evento.evento.pk %}">{{ evento.evento.nome }}</a></h5>
<h6>({{ evento.evento.tipo_evento }})</h6>
<dl class="dl-horizontal">
{% if evento.evento.solicitante %}
<dt>{% trans "Solicitante" %}:</dt>
<dd>{{ evento.evento.solicitante }}</dd>
{% endif %}
{% if evento.evento.casa_anfitria %}
<dt>{% trans "Casa anfitriã" %}:</dt>
<dd>{{ evento.evento.casa_anfitria }}<dd>
{% endif %}
<dt>{% trans "Município" %}:</dt>
<dd>{{ evento.evento.municipio }}<dd>
<dt>{% trans "Status" %}:</dt>
<dd>{{ evento.evento.get_status_display }}<dd>
{% if evento.evento.data_cancelamento %}
<dt>{% trans "Data de cancelamento" %}:</dt>
<dd>{{ evento.evento.data_cancelamento }}<dd>
{% endif %}
{% if evento.evento.equipe_set.count > 0 %}
<dt>{% trans "Equipe" %}:</dt>
<dd><ul class="list-unstyled">
{% for m in evento.evento.equipe_set.all %}
<li>{{ m.membro }} ({{ m.funcao }})</li>
{% endfor %}
<ul><dd>
{% endif %}
</dl>
</td>
{% if evento.close > 0 %}
<td colspan="{{ evento.close }}">&nbsp;</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</table>
</div>
{% endblock %} {% endblock %}

59
sigi/apps/eventos/templates/eventos/calendario_pdf.html

@ -0,0 +1,59 @@
{% extends "base_report.html" %}
{% load static from staticfiles %}
{% load i18n %}
{% block extra_head %}
<style>
@page {
size: A4 landscape;
margin: 1cm;
}
* { font-size: 10px;}
a {
color: black;
text-decoration: none;
}
dt {
font-weight: 700;
}
dd {
margin-left: 2mm;
}
table, th, td {
border: 1px solid #ddd;
}
table {
border-collapse: collapse;
}
td, th {
padding: 2px;
vertical-align: top;
}
th {
text-align: center !important;
vertical-align: bottom !important;
}
.status-P { background-color: #ffffb0}
.status-A { background-color: #a6ebff}
.status-O { background-color: #c2ffc2}
.status-R { background-color: #ffdaa6}
.status-C { background-color: #d98f8d}
</style>
<title>{% blocktrans %}Eventos de {{ mes_pesquisa }}/{{ ano_pesquisa }}{% endblocktrans %}</title>
{% endblock %}
{% block report %}
<h1>{% blocktrans %}Eventos de {{ mes_pesquisa }}/{{ ano_pesquisa }}{% endblocktrans %}</h1>
{% include "eventos/calendario_snippet.html" %}
{% endblock %}
</body>
</html>

68
sigi/apps/eventos/templates/eventos/calendario_snippet.html

@ -0,0 +1,68 @@
{% load i18n admin_static %}
{% load static from staticfiles %}
<div class="table-responsive">
<table class="table table-condensed table-bordered" repeat="2">
<thead>
<tr>
{% for d in dates %}
<th>{{ d|date:'D' }}</th>
{% endfor %}
</tr>
<tr>
{% for d in dates %}
<th>{% ifchanged d|date:'b' %}{{ d|date:'b' }}<br/>{% endifchanged %}{{ d|date:'j' }}</th>
{% endfor %}
</tr>
</thead>
{% for linha in linhas %}
<tr>
{% for evento in linha %}
{% if evento.start > 0 %}
<td colspan="{{ evento.start }}">&nbsp;</td>
{% endif %}
<td colspan="{{ evento.duration }}" class="status-{{ evento.evento.status }}">
<h5><a href="{% url 'admin:eventos_evento_change' evento.evento.pk %}">{{ evento.evento.nome }}</a></h5>
<h6>({{ evento.evento.tipo_evento }})</h6>
<dl class="dl-horizontal">
{% if evento.evento.solicitante %}
<dt>{% trans "Solicitante" %}:</dt>
<dd>{{ evento.evento.solicitante }}</dd>
{% endif %}
{% if evento.evento.casa_anfitria %}
<dt>{% trans "Casa anfitriã" %}:</dt>
<dd>{{ evento.evento.casa_anfitria }}<dd>
{% endif %}
<dt>{% trans "Município" %}:</dt>
<dd>{{ evento.evento.municipio }}<dd>
<dt>{% trans "Status" %}:</dt>
<dd>{{ evento.evento.get_status_display }}<dd>
{% if evento.evento.data_cancelamento %}
<dt>{% trans "Data de cancelamento" %}:</dt>
<dd>{{ evento.evento.data_cancelamento }}<dd>
{% endif %}
{% if evento.evento.equipe_set.count > 0 %}
<dt>{% trans "Equipe" %}:</dt>
<dd><ul class="list-unstyled">
{% for m in evento.evento.equipe_set.all %}
<li>{{ m.membro }} ({{ m.funcao }})</li>
{% endfor %}
<ul><dd>
{% endif %}
</dl>
</td>
{% if evento.close > 0 %}
<td colspan="{{ evento.close }}">&nbsp;</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</table>
</div>

28
sigi/apps/eventos/views.py

@ -27,11 +27,15 @@ from django.utils import translation
from django.utils.translation import ungettext, ugettext as _ from django.utils.translation import ungettext, ugettext as _
from sigi.apps.eventos.models import Evento from sigi.apps.eventos.models import Evento
from sigi.apps.servidores.models import Servidor from sigi.apps.servidores.models import Servidor
from sigi.shortcuts import render_to_pdf
import csv
from django.http.response import JsonResponse, HttpResponse
@login_required @login_required
def calendario(request): def calendario(request):
mes_pesquisa = int(request.GET.get('mes', datetime.date.today().month)) mes_pesquisa = int(request.GET.get('mes', datetime.date.today().month))
ano_pesquisa = int(request.GET.get('ano', datetime.date.today().year)) ano_pesquisa = int(request.GET.get('ano', datetime.date.today().year))
formato = request.GET.get('fmt', 'html')
dia1 = datetime.date(ano_pesquisa, mes_pesquisa, 1) dia1 = datetime.date(ano_pesquisa, mes_pesquisa, 1)
mes_anterior = dia1 - datetime.timedelta(days=1) mes_anterior = dia1 - datetime.timedelta(days=1)
@ -107,10 +111,14 @@ def calendario(request):
data['eventos'] = eventos data['eventos'] = eventos
data['linhas'] = linhas data['linhas'] = linhas
if formato == 'pdf':
return render_to_pdf('eventos/calendario_pdf.html', data )
return render(request, 'eventos/calendario.html', data) return render(request, 'eventos/calendario.html', data)
def alocacao_equipe(request): def alocacao_equipe(request):
ano_pesquisa = int(request.GET.get('ano', datetime.date.today().year)) ano_pesquisa = int(request.GET.get('ano', datetime.date.today().year))
formato = request.GET.get('fmt', 'html')
data = {'ano_pesquisa': ano_pesquisa} data = {'ano_pesquisa': ano_pesquisa}
@ -140,8 +148,9 @@ def alocacao_equipe(request):
lang = (translation.to_locale(translation.get_language())+'.utf8').encode() lang = (translation.to_locale(translation.get_language())+'.utf8').encode()
locale.setlocale(locale.LC_ALL, lang) locale.setlocale(locale.LC_ALL, lang)
meses = [calendar.month_name[m] for m in range(1,13)]
linhas = [[_(u"Servidor")] + [calendar.month_name[m] for m in range(1,13)] + ['total']] linhas = [[_(u"Servidor")] + meses + ['total']]
for r in dados: for r in dados:
r[2].append(reduce(lambda x,y:{'dias': x['dias'] + y['dias'], r[2].append(reduce(lambda x,y:{'dias': x['dias'] + y['dias'],
@ -161,4 +170,21 @@ def alocacao_equipe(request):
data['linhas'] = linhas data['linhas'] = linhas
if formato == 'pdf':
return render_to_pdf('eventos/alocacao_equipe_pdf.html', data)
elif formato == 'csv':
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="alocacao_equipe_%s.csv"' % (ano_pesquisa,)
writer = csv.writer(response)
asc_list = [[s.encode('utf-8') if isinstance(s, unicode) else s for s in l] for l in linhas]
writer.writerows(asc_list)
return response
elif formato == 'json':
result = {'ano': ano_pesquisa,
'equipe': [{'pk': d[0],
'nome_completo': d[1],
'meses': {m[0]: m[1] for m in zip(meses+['total'], d[2])}
} for d in dados]}
return JsonResponse(result)
return render(request, 'eventos/alocacao_equipe.html', data) return render(request, 'eventos/alocacao_equipe.html', data)
Loading…
Cancel
Save