From afeb5609f1bafa15733f901bb0aefd8b71ce1db0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ses=C3=B3stris=20Vieira?= Date: Thu, 9 Jun 2022 20:50:46 -0300 Subject: [PATCH] =?UTF-8?q?Impress=C3=A3o=20do=20calend=C3=A1rio=20em=20PD?= =?UTF-8?q?F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eventos/templates/eventos/calendario.html | 26 ++-- .../templates/eventos/calendario_pdf.html | 112 +++++++++--------- .../eventos/snippets/calendario_lista.html | 32 ++++- sigi/apps/eventos/views.py | 102 +++------------- 4 files changed, 120 insertions(+), 152 deletions(-) diff --git a/sigi/apps/eventos/templates/eventos/calendario.html b/sigi/apps/eventos/templates/eventos/calendario.html index 2c5830e..2e9f3b1 100644 --- a/sigi/apps/eventos/templates/eventos/calendario.html +++ b/sigi/apps/eventos/templates/eventos/calendario.html @@ -11,15 +11,24 @@ {% block coltype %}colMS{% endblock %} {% block content %} +
+ + mode_edit + + +
-
- {% if formato == 'cal' %} - view_list - {% else %} - date_range - {% endif %} -
-
+
    {% for ano in meses %}
  • {{ ano| safe }}
  • @@ -48,6 +57,7 @@ $(document).ready(function(){ M.Tabs.init($('.tabs'), {}); M.Modal.init($(".modal"), {}); + M.FloatingActionButton.init($(".fixed-action-btn"), {hoverEnabled: false}); }); {% endblock %} diff --git a/sigi/apps/eventos/templates/eventos/calendario_pdf.html b/sigi/apps/eventos/templates/eventos/calendario_pdf.html index d1e5352..f5847c9 100644 --- a/sigi/apps/eventos/templates/eventos/calendario_pdf.html +++ b/sigi/apps/eventos/templates/eventos/calendario_pdf.html @@ -1,59 +1,59 @@ -{% extends "base_report.html" %} -{% load static from staticfiles %} -{% load i18n %} +{% extends 'pdf/base_report.html' %} +{% load static i18n %} -{% block extra_head %} - -{% blocktrans %}Eventos de {{ mes_pesquisa }}/{{ ano_pesquisa }}{% endblocktrans %} +{% block extra_style %} + {{ block.super }} + a { + color: black; + text-decoration: none; + } + table { + table-layout: fixed; +} + table td, + table td * { + vertical-align: top; + } + span.numero-dia { + font-size: 0.5em; + } + .card { + background-color: #fff; + padding: 15px; + margin: 10px 0; + } + .card .card-content .card-title { + display: block; + line-height: 32px; + margin-bottom: 8px; + font-weight: 300; + } + .card-title { + font-size: 20px !important; + margin-bottom: -6px !important; + } + .data-evento { + font-size: 0.7em; + display: block; + } + .tipo-evento { + font-size: 0.7em; + color: var(--body-quiet-color); + display: block; + margin-bottom: 8px; + } + .cyan.lighten-4 { background-color: #b2ebf2 !important; } + .brown.lighten-4 { background-color: #d7ccc8 !important; } + .deep-orange.lighten-4 { background-color: #ffccbc !important; } + .cyan.lighten-4 { background-color: #b2ebf2 !important; } + .green.lighten-4 { background-color: #c8e6c9 !important; } + .lime.lighten-4 { background-color: #f0f4c3 !important; } {% endblock %} -{% block report %} -

    {% blocktrans %}Eventos de {{ mes_pesquisa }}/{{ ano_pesquisa }}{% endblocktrans %}

    - {% include "eventos/calendario_snippet.html" %} -{% endblock %} - - +{% block main_content %} +

    + {% blocktrans with month=mes_pesquisa|stringformat:"02d" year=ano_pesquisa|stringformat:"04d" %}Ref: {{ month }}/{{year}}{% endblocktrans %} +

    + {% include "eventos/snippets/calendario_cal.html" %} + {% include "eventos/snippets/calendario_lista.html" %} +{% endblock main_content %} \ No newline at end of file diff --git a/sigi/apps/eventos/templates/eventos/snippets/calendario_lista.html b/sigi/apps/eventos/templates/eventos/snippets/calendario_lista.html index e796fb7..e9354bd 100644 --- a/sigi/apps/eventos/templates/eventos/snippets/calendario_lista.html +++ b/sigi/apps/eventos/templates/eventos/snippets/calendario_lista.html @@ -26,7 +26,37 @@ {% endfor %}

    {% endif %} - {% trans "Ver detalhes" %} + {% if pdf %} + {% if evento.convite_set %} + + + + + + + + + + + + {% for convite in evento.convite_set.all %} + + + + + + + + {% endfor %} +
    {% trans "Casas covidadas" %}
    CasaUFAceitouParticipouParticipantes
    {{ convite.casa.nome }}{{ convite.casa.municipio.uf }}{% if convite.aceite %}check{% endif %}{% if convite.participou %}check{% endif %} + {% for nome in convite.nomes_participantes.splitlines %} + {{ nome }}{% if not forloop.last %}, {% endif %} + {% endfor %} +
    + {% endif %} + {% else %} + {% trans "Ver detalhes" %} + {% endif %}
diff --git a/sigi/apps/eventos/views.py b/sigi/apps/eventos/views.py index ac07484..75b860b 100644 --- a/sigi/apps/eventos/views.py +++ b/sigi/apps/eventos/views.py @@ -13,6 +13,7 @@ from django.utils.text import slugify from django.utils.translation import to_locale, get_language, gettext as _ from django.urls import reverse from django_weasyprint.utils import django_url_fetcher +from django_weasyprint.views import WeasyTemplateResponse from docx import Document from weasyprint import HTML from sigi.apps.casas.models import Funcionario, Orgao, Presidente @@ -32,6 +33,7 @@ def calendario(request): mes_pesquisa = int(request.GET.get("mes", timezone.localdate().month)) ano_pesquisa = int(request.GET.get("ano", timezone.localdate().year)) formato = request.GET.get("fmt", "cal") + pdf = bool(request.GET.get("pdf", 0)) meses = {} lang = to_locale(get_language()) + ".UTF-8" @@ -53,7 +55,7 @@ def calendario(request): context = site.each_context(request) or {} - if formato == "cal": + if formato == "cal" or pdf: semanas = calendar.Calendar().monthdatescalendar( ano_pesquisa, mes_pesquisa ) @@ -85,7 +87,18 @@ def calendario(request): } ) - return render(request, "eventos/calendario.html", context) + if pdf: + context["title"] = _("Calendário de eventos") + context["pdf"] = True + return WeasyTemplateResponse( + filename="calendario_mensal.pdf", + request=request, + template="eventos/calendario_pdf.html", + context=context, + content_type="application/pdf", + ) + else: + return render(request, "eventos/calendario.html", context) @login_required @@ -369,91 +382,6 @@ def gerar_anexo(casa, presidente, contato, path, modelo, nome, texto): return anexo -# @login_required -# def calendario(request): -# mes_pesquisa = int(request.GET.get('mes', timezone.localdate().month)) -# ano_pesquisa = int(request.GET.get('ano', timezone.localdate().year)) -# formato = request.GET.get('fmt', 'html') - -# dia1 = datetime.date(ano_pesquisa, mes_pesquisa, 1) -# mes_anterior = dia1 - datetime.timedelta(days=1) -# mes_seguinte = dia1.replace(day=28) + datetime.timedelta(days=4) # Ugly hack -# mes_seguinte = mes_seguinte.replace(day=1) - -# data = {'mes_pesquisa': mes_pesquisa, 'ano_pesquisa': ano_pesquisa} - -# if Evento.objects.filter(data_inicio__year=mes_anterior.year, -# data_inicio__month=mes_anterior.month).exists(): -# data['prev_button'] = {'mes': mes_anterior.month, 'ano': mes_anterior.year } - -# if Evento.objects.filter(data_inicio__year=mes_seguinte.year, -# data_inicio__month=mes_seguinte.month).exists(): -# data['next_button'] = {'mes': mes_seguinte.month, 'ano': mes_seguinte.year } - -# c = calendar.Calendar(6) -# dates = reduce(lambda x,y: x+y, c.monthdatescalendar(ano_pesquisa, mes_pesquisa)) - -# eventos = [] - -# for evento in Evento.objects.filter(data_inicio__year=ano_pesquisa, -# data_inicio__month=mes_pesquisa).order_by('data_inicio'): -# start = dates.index(evento.data_inicio.date()) -# if not evento.data_termino.date() in dates: -# lastday = dates[-1] -# while lastday < evento.data_termino.date(): -# lastday = lastday + datetime.timedelta(days=1) -# dates.append(lastday) -# eventos.append({'evento': evento, 'start': start}) - -# # Calcula a distância dos eventos para as bordas do calendário -# for evento in eventos: -# end = dates.index(evento['evento'].data_termino.date()) -# evento['duration'] = end-evento['start']+1 -# evento['close'] = len(dates)-end-1 - -# # Agrupa os eventos em linhas para melhorar a visualização -# linhas = [] - -# for evento in eventos: -# encaixado = False -# for linha in linhas: -# sobrepoe = False -# for e in linha: -# if (((evento['evento'].data_inicio.date() >= e['evento'].data_inicio.date()) and -# (evento['evento'].data_inicio.date() <= e['evento'].data_termino.date())) or -# ((evento['evento'].data_termino.date() >= e['evento'].data_inicio.date()) and -# (evento['evento'].data_termino.date() <= e['evento'].data_termino.date()))): -# sobrepoe = True -# break -# if not sobrepoe: -# # Adiona o evento em uma linha que ele não sobrepoe nenhum outro -# linha.append(evento) -# encaixado = True -# break -# if not encaixado: -# # Adiciona uma nova linha porque este evento não se encaixa em nenhuma existente -# linhas.append([evento]) - -# # Recalcula as distâncias dos eventos por linha para encaixar no calendário -# for linha in linhas: -# anterior = None -# for evento in linha: -# if anterior is None: -# anterior = evento -# continue -# anterior['close'] = (evento['evento'].data_inicio.date() - anterior['evento'].data_termino.date()).days-1 -# evento['start'] = 0 -# anterior = evento - -# data['dates'] = dates -# data['eventos'] = eventos -# data['linhas'] = linhas - -# if formato == 'pdf': -# return render_to_pdf('eventos/calendario_pdf.html', data ) - -# return render(request, 'eventos/calendario.html', data) - # @login_required # def alocacao_equipe(request): # ano_pesquisa = int(request.GET.get('ano', timezone.localdate().year))