Browse Source

Calendário de eventos

pull/159/head
Sesostris Vieira 3 years ago
parent
commit
126fb36ffe
  1. 42
      sigi/apps/eventos/static/css/calendario.css
  2. 84
      sigi/apps/eventos/templates/eventos/calendario.html
  3. 28
      sigi/apps/eventos/templates/eventos/snippets/calendario_cal.html
  4. 34
      sigi/apps/eventos/templates/eventos/snippets/calendario_lista.html
  5. 60
      sigi/apps/eventos/templates/eventos/snippets/calendario_modals.html
  6. 1
      sigi/apps/eventos/templates/eventos/snippets/calendario_status_color.html
  7. 40
      sigi/apps/eventos/views.py
  8. 6
      sigi/menu_conf.yaml

42
sigi/apps/eventos/static/css/calendario.css

@ -0,0 +1,42 @@
#content {
display: block;
}
.data-evento {
font-size: 0.6em;
color: var(--body-quiet-color);
display: block;
}
.tipo-evento {
font-size: 0.6em;
color: var(--body-quiet-color);
display: block;
margin-bottom: 8px;
}
.card-title {
font-size: 20px !important;
margin-bottom: -6px !important;
}
.card .card-content p {
margin: 12px;
}
a.format-selector .material-icons {
line-height: 48px;
}
table {
table-layout: fixed;
}
table td,
table td * {
vertical-align: top;
}
span.numero-dia {
font-size: 0.5em;
}

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

@ -2,11 +2,24 @@
{% load i18n %} {% load i18n %}
{% load static %} {% load static %}
{% block extrastyle %}
{{ block.super }}
<link rel="stylesheet" type="text/css" href="/static/css/calendario.css">
{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block coltype %}colMS{% endblock %} {% block coltype %}colMS{% endblock %}
{% block content %} {% block content %}
<div class="row"> <div class="row">
<div class="col s12"> <div class="col s1">
{% if formato == 'cal' %}
<a class="format-selector" href="?ano={{ ano_pesquisa|safe }}&mes={{ mes_pesquisa|safe }}&fmt=tab" title="{% trans 'Formato de lista' %}"><i class="material-icons">view_list</i></a>
{% else %}
<a class="format-selector" href="?ano={{ ano_pesquisa|safe }}&mes={{ mes_pesquisa|safe }}&fmt=cal" title="{% trans 'Formato de calendário' %}"><i class="material-icons">date_range</i></a>
{% endif %}
</div>
<div class="col s11">
<ul class="tabs"> <ul class="tabs">
{% for ano in meses %} {% for ano in meses %}
<li class="tab col"><a {% if ano == ano_pesquisa %}class="active"{% endif %} href="#tab-{{ ano|safe }}">{{ ano| safe }}</a></li> <li class="tab col"><a {% if ano == ano_pesquisa %}class="active"{% endif %} href="#tab-{{ ano|safe }}">{{ ano| safe }}</a></li>
@ -16,76 +29,25 @@
{% for ano, lista in meses.items %} {% for ano, lista in meses.items %}
<div id="tab-{{ ano|safe }}" class="col s12"> <div id="tab-{{ ano|safe }}" class="col s12">
{% for mes, nome in lista.items %} {% for mes, nome in lista.items %}
<a class="waves-effect waves-light btn-flat btn-small{% if ano == ano_pesquisa and mes == mes_pesquisa %} disabled{% endif %}" href="?ano={{ ano|safe }}&mes={{ mes|safe }}">{{ nome }}</a> <a class="waves-effect waves-light btn-flat btn-small{% if ano == ano_pesquisa and mes == mes_pesquisa %} disabled{% endif %}" href="?ano={{ ano|safe }}&mes={{ mes|safe }}&fmt={{ formato }}">{{ nome }}</a>
{% endfor %} {% endfor %}
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
{% if formato == "cal" %}
{% for evento in eventos %} {% include "eventos/snippets/calendario_cal.html" %}
<div class="row"> {% else %}
<div class="col s12"> {% include "eventos/snippets/calendario_lista.html" %}
<div class="card"> {% endif %}
<div class="card-content"> {% include "eventos/snippets/calendario_modals.html" %}
<span class="card-title">{{ evento.nome }}</span>
<p>Os detalhes virão aqui</p>
</div>
</div>
</div>
</div>
{% endfor %}
{% endblock %} {% endblock %}
{% block footer %} {% block footer %}
{{ block.super }} {{ block.super }}
<script> <script>
$(document).ready(function(){ $(document).ready(function(){
var elements = $('.tabs'); M.Tabs.init($('.tabs'), {});
M.Tabs.init(elements, {}); M.Modal.init($(".modal"), {});
}); });
</script> </script>
{% endblock %} {% endblock %}
{% comment %}
{% block extrastyle %}
<style type="text/css">
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>
{{ block.super }}
{% endblock %}
{% block extrahead %}
{{ block.super }}
{% endblock %}
{% block coltype %}colMS{% endblock %}
{% block content_title %}<h1>{% blocktrans %}Eventos de {{ mes_pesquisa }}/{{ ano_pesquisa }}{% endblocktrans %}</h1>{% endblock %}
{% block object-tools-items %}
{% if prev_button %}
<li><a href="?mes={{ prev_button.mes|safe }}&ano={{ prev_button.ano|safe }}">{% trans "Mês anterior" %}</a></li>
{% endif %}
{% if next_button %}
<li><a href="?mes={{ next_button.mes|safe }}&ano={{ next_button.ano|safe }}">{% trans "Próximo mês" %}</a></li>
{% endif %}
<li><a href="?mes={{ mes_pesquisa|safe }}&ano={{ ano_pesquisa|safe }}&fmt=pdf" target="_blank">{% trans "Exportar para PDF" %}</a></li>
{% endblock %}
{% block content %}
{% include "eventos/calendario_snippet.html" %}
{% endblock %}
{% endcomment %}

28
sigi/apps/eventos/templates/eventos/snippets/calendario_cal.html

@ -0,0 +1,28 @@
{% load i18n %}
{% load static %}
<div style="width: 100%;">
<table class="">
<thead>
{% for name in day_names %}
<th>{{ name }}</th>
{% endfor %}
</thead>
<tbody>
{% for semana in semanas %}
<tr>
{% for dia in semana %}
<td>
<span class="numero-dia">{{ dia.0 }}</span>
{% for evento in dia.1 %}
<p class="evento truncate {% include 'eventos/snippets/calendario_status_color.html' with status=evento.status %}">
<a class="modal-trigger" href="#modal{{ evento.id|safe }}" title="{{ evento.nome }}">{{ evento.nome }}</a>
</p>
{% endfor %}
</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
</div>

34
sigi/apps/eventos/templates/eventos/snippets/calendario_lista.html

@ -0,0 +1,34 @@
{% load i18n %}
{% load static %}
{% for evento in eventos %}
<div class="row">
<div class="col s12">
<div class="card {% include 'eventos/snippets/calendario_status_color.html' with status=evento.status %}">
<div class="card-content">
<span class="card-title">{{ evento.nome }}</span>
<span class="data-evento">{{ evento.data_inicio }} a {{ evento.data_termino }}</span>
<span class="tipo-evento">
{{ evento.tipo_evento }} -
{{ evento.tipo_evento.get_categoria_display }} -
{{ evento.get_status_display }}
{% if evento.virtual %} {% trans "na modalidade virtual" %}{% endif %}
{% if evento.casa_anfitria %} {% trans "em" %} {{ evento.casa_anfitria }}{% endif %}
</span>
<p>{{ evento.descricao }}</p>
<p>{% trans "Solicitante" %}: {{ evento.solicitante }}</p>
{% if evento.equipe_set.all %}
<p>
{% trans "Equipe" %}:
{% for membro in evento.equipe_set.all %}
{{ membro.membro }} ({{ membro.funcao }})
{% if not forloop.last %} - {% endif %}
{% endfor %}
</p>
{% endif %}
<a class="modal-trigger right" href="#modal{{ evento.id|safe }}">{% trans "Ver detalhes" %}</a>
</div>
</div>
</div>
</div>
{% endfor %}

60
sigi/apps/eventos/templates/eventos/snippets/calendario_modals.html

@ -0,0 +1,60 @@
{% load i18n %}
{% for evento in eventos %}
<div id="modal{{ evento.id|safe }}" class="modal">
<div class="modal-content">
<h6>{{ evento.nome }}</h6>
<span class="data-evento">{{ evento.data_inicio }} a {{ evento.data_termino }}</span>
<span class="tipo-evento">
{{ evento.tipo_evento }} -
{{ evento.tipo_evento.get_categoria_display }} -
{{ evento.get_status_display }}
{% if evento.virtual %} {% trans "na modalidade virtual" %}{% endif %}
{% if evento.casa_anfitria %} {% trans "em" %} {{ evento.casa_anfitria }}{% endif %}
</span>
<p>{{ evento.descricao }}</p>
<p>{% trans "Solicitante" %}: {{ evento.solicitante }}</p>
{% if evento.equipe_set.all %}
<p>
{% trans "Equipe" %}:
{% for membro in evento.equipe_set.all %}
{{ membro.membro }} ({{ membro.funcao }})
{% if not forloop.last %} - {% endif %}
{% endfor %}
</p>
{% endif %}
{% if evento.convite_set %}
<table class="stripped">
<caption>{% trans "Casas covidadas" %}</caption>
<thead>
<tr>
<td>Casa</td>
<td>UF</td>
<td>Aceitou</td>
<td>Participou</td>
<td>Participantes</td>
</tr>
</thead>
{% for convite in evento.convite_set.all %}
<tr>
<td>{{ convite.casa.nome }}</td>
<td>{{ convite.casa.municipio.uf }}</td>
<td>{% if convite.aceite %}<i class="material-icons tiny">check</i>{% endif %}</td>
<td>{% if convite.participou %}<i class="material-icons tiny">check</i>{% endif %}</td>
<td>
{% for nome in convite.nomes_participantes.splitlines %}
{{ nome }}{% if not forloop.last %}, {% endif %}
{% endfor %}
</td>
</tr>
{% endfor %}
</table>
{% endif %}
</div>
<div class="modal-footer">
<a href="{{ evento.get_absolute_url }}" class="modal-close waves-effect waves-green btn-flat">{% trans "Ver no site" %}</a>
<a href="{% url 'admin:eventos_evento_change' evento.id %}" class="modal-close waves-effect waves-green btn-flat">{% trans "Editar" %}</a>
<a href="#!" class="modal-close waves-effect waves-green btn-flat">{% trans "Close" %}</a>
</div>
</div>
{% endfor %}

1
sigi/apps/eventos/templates/eventos/snippets/calendario_status_color.html

@ -0,0 +1 @@
{% if status == 'Q' %}brown{% endif %}{% if status == 'C' %}deep-orange{% endif %}{% if status == 'R' %}cyan{% endif %}{% if status == 'O' %}green{% endif %}{% if status == 'A' %}lime{% endif %}{% if status not in "EGP" %} lighten-4{% endif %}

40
sigi/apps/eventos/views.py

@ -1,3 +1,4 @@
from datetime import datetime
import calendar import calendar
import locale import locale
from django.contrib import messages from django.contrib import messages
@ -30,7 +31,7 @@ from sigi.apps.servidores.models import Servidor
def calendario(request): def calendario(request):
mes_pesquisa = int(request.GET.get("mes", timezone.localdate().month)) mes_pesquisa = int(request.GET.get("mes", timezone.localdate().month))
ano_pesquisa = int(request.GET.get("ano", timezone.localdate().year)) ano_pesquisa = int(request.GET.get("ano", timezone.localdate().year))
formato = request.GET.get("fmt", "html") formato = request.GET.get("fmt", "cal")
meses = {} meses = {}
lang = to_locale(get_language()) + ".UTF-8" lang = to_locale(get_language()) + ".UTF-8"
@ -46,14 +47,43 @@ def calendario(request):
else: else:
meses[ano] = {mes: calendar.month_name[mes]} meses[ano] = {mes: calendar.month_name[mes]}
context = { eventos = Evento.objects.filter(
data_inicio__year=ano_pesquisa, data_inicio__month=mes_pesquisa
)
context = site.each_context(request) or {}
if formato == "cal":
semanas = calendar.Calendar().monthdatescalendar(
ano_pesquisa, mes_pesquisa
)
for semana in semanas:
for dia in semana:
if dia.month == mes_pesquisa:
semana[dia.weekday()] = (
dia.day,
[
e
for e in eventos
if e.data_inicio.day
<= dia.day
<= e.data_termino.day
],
)
else:
semana[dia.weekday()] = ("", [])
context["semanas"] = semanas
context.update(
{
"ano_pesquisa": ano_pesquisa, "ano_pesquisa": ano_pesquisa,
"mes_pesquisa": mes_pesquisa, "mes_pesquisa": mes_pesquisa,
"formato": formato,
"meses": meses, "meses": meses,
"eventos": Evento.objects.filter( "day_names": calendar.day_abbr,
data_inicio__year=ano_pesquisa, data_inicio__month=mes_pesquisa "eventos": eventos,
),
} }
)
return render(request, "eventos/calendario.html", context) return render(request, "eventos/calendario.html", context)

6
sigi/menu_conf.yaml

@ -31,6 +31,8 @@ main_menu:
- title: Assembléias Legislativas - title: Assembléias Legislativas
view_name: admin:casas_orgao_changelist view_name: admin:casas_orgao_changelist
querystr: tipo__sigla__exact=AL querystr: tipo__sigla__exact=AL
# - title: Parlamentares
# view_name: admin:parlamentares_parlamentar_changelist
- title: Demais órgãos - title: Demais órgãos
view_name: admin:casas_orgao_changelist view_name: admin:casas_orgao_changelist
querystr: tipo__legislativo__exact=0 querystr: tipo__legislativo__exact=0
@ -82,7 +84,7 @@ main_menu:
view_name: admin:eventos_evento_changelist view_name: admin:eventos_evento_changelist
querystr: tipo_evento__categoria__exact=V querystr: tipo_evento__categoria__exact=V
- title: Calendário mensal - title: Calendário mensal
view_name: view_name: eventos-calendario
- title: Alocação de equipe - title: Alocação de equipe
view_name: view_name:
- title: Servidores - title: Servidores
@ -113,3 +115,5 @@ main_menu:
view_name: admin:eventos_funcao_changelist view_name: admin:eventos_funcao_changelist
- title: Modelos de declaração - title: Modelos de declaração
view_name: admin:eventos_modelodeclaracao_changelist view_name: admin:eventos_modelodeclaracao_changelist
# - title: Partidos políticos
# view_name: admin:parlamentares_partido_changelist

Loading…
Cancel
Save