diff --git a/sigi/apps/casas/admin.py b/sigi/apps/casas/admin.py
index edc8ef1..1dfe8bf 100644
--- a/sigi/apps/casas/admin.py
+++ b/sigi/apps/casas/admin.py
@@ -81,6 +81,8 @@ class PresidenteInline(admin.StackedInline):
"nome",
"sexo",
"data_nascimento",
+ "cpf",
+ "identidade",
"nota",
"email",
"tempo_de_servico",
@@ -113,6 +115,8 @@ class ContatoInterlegisInline(admin.StackedInline):
"nome",
"sexo",
"data_nascimento",
+ "cpf",
+ "identidade",
"nota",
"email",
"cargo",
@@ -459,6 +463,7 @@ class OrgaoAdmin(CartExportReportMixin, admin.ModelAdmin):
"observacoes",
"horario_funcionamento",
"foto",
+ "brasao",
),
},
),
diff --git a/sigi/apps/casas/migrations/0022_orgao_brasao_orgao_brasao_altura_and_more.py b/sigi/apps/casas/migrations/0022_orgao_brasao_orgao_brasao_altura_and_more.py
new file mode 100644
index 0000000..cd1a09b
--- /dev/null
+++ b/sigi/apps/casas/migrations/0022_orgao_brasao_orgao_brasao_altura_and_more.py
@@ -0,0 +1,28 @@
+# Generated by Django 4.0.4 on 2022-04-24 17:31
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('casas', '0021_alter_orgao_options_remove_orgao_recorte_and_more'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='orgao',
+ name='brasao',
+ field=models.ImageField(blank=True, height_field='brasao_altura', help_text='Trate a imagem para que ela fique com cerca de 120x120 pixels', upload_to='imagens/casas/brasao', verbose_name='brasão', width_field='brasao_largura'),
+ ),
+ migrations.AddField(
+ model_name='orgao',
+ name='brasao_altura',
+ field=models.SmallIntegerField(editable=False, null=True),
+ ),
+ migrations.AddField(
+ model_name='orgao',
+ name='brasao_largura',
+ field=models.SmallIntegerField(editable=False, null=True),
+ ),
+ ]
diff --git a/sigi/apps/casas/migrations/0023_funcionario_cpf_funcionario_identidade.py b/sigi/apps/casas/migrations/0023_funcionario_cpf_funcionario_identidade.py
new file mode 100644
index 0000000..0412fe3
--- /dev/null
+++ b/sigi/apps/casas/migrations/0023_funcionario_cpf_funcionario_identidade.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.0.4 on 2022-04-25 21:46
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('casas', '0022_orgao_brasao_orgao_brasao_altura_and_more'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='funcionario',
+ name='cpf',
+ field=models.CharField(blank=True, max_length=20, verbose_name='CPF'),
+ ),
+ migrations.AddField(
+ model_name='funcionario',
+ name='identidade',
+ field=models.CharField(blank=True, help_text='Informe o RG e o órgão emissor.', max_length=30, verbose_name='Identidade (RG)'),
+ ),
+ ]
diff --git a/sigi/apps/casas/models.py b/sigi/apps/casas/models.py
index b800921..cedca2f 100644
--- a/sigi/apps/casas/models.py
+++ b/sigi/apps/casas/models.py
@@ -113,6 +113,18 @@ class Orgao(models.Model):
data_instalacao = models.DateField(
_("data de instalação da Casa Legislativa"), null=True, blank=True
)
+ brasao = models.ImageField(
+ _("brasão"),
+ upload_to="imagens/casas/brasao",
+ width_field="brasao_largura",
+ height_field="brasao_altura",
+ blank=True,
+ help_text=_(
+ "Trate a imagem para que ela fique com cerca de 120x120 pixels"
+ ),
+ )
+ brasao_largura = models.SmallIntegerField(editable=False, null=True)
+ brasao_altura = models.SmallIntegerField(editable=False, null=True)
class Meta:
ordering = ("nome",)
@@ -354,6 +366,13 @@ class Funcionario(models.Model):
data_nascimento = models.DateField(
_("data de nascimento"), blank=True, null=True
)
+ cpf = models.CharField(_("CPF"), max_length=20, blank=True)
+ identidade = models.CharField(
+ _("Identidade (RG)"),
+ max_length=30,
+ blank=True,
+ help_text=_("Informe o RG e o órgão emissor."),
+ )
nota = models.CharField(
_("telefones"), max_length=250, null=True, blank=True
)
diff --git a/sigi/apps/convenios/admin.py b/sigi/apps/convenios/admin.py
index fcab3aa..7bec97a 100644
--- a/sigi/apps/convenios/admin.py
+++ b/sigi/apps/convenios/admin.py
@@ -2,6 +2,9 @@ from django.contrib import admin
from django.http import HttpResponse, HttpResponseRedirect
from django.utils.translation import gettext as _
from django.utils.safestring import mark_safe
+from django_weasyprint.views import WeasyTemplateResponse
+from tinymce.models import HTMLField
+from tinymce.widgets import AdminTinyMCE
from sigi.apps.convenios.models import (
Projeto,
StatusConvenio,
@@ -16,7 +19,6 @@ from sigi.apps.utils import queryset_ascii
from sigi.apps.servidores.models import Servidor
from sigi.apps.casas.admin import ConveniosInline, GerentesInterlegisFilter
from sigi.apps.utils.mixins import CartExportReportMixin, LabeledResourse
-from django_weasyprint.views import WeasyTemplateResponse
from sigi.apps.utils.filters import DateRangeFilter
@@ -80,6 +82,12 @@ class AcompanhaFilter(admin.filters.RelatedFieldListFilter):
self.lookup_choices = [(x.id, x) for x in servidores]
+@admin.register(Projeto)
+class ProjetoAdmin(admin.ModelAdmin):
+ list_display = ("sigla", "nome")
+ formfield_overrides = {HTMLField: {"widget": AdminTinyMCE}}
+
+
@admin.register(Convenio)
class ConvenioAdmin(CartExportReportMixin, admin.ModelAdmin):
fieldsets = (
@@ -339,6 +347,5 @@ class GesconAdmin(admin.ModelAdmin):
]
-admin.site.register(Projeto)
admin.site.register(StatusConvenio)
admin.site.register(TipoSolicitacao)
diff --git a/sigi/apps/convenios/migrations/0021_projeto_texto_minuta_projeto_texto_oficio.py b/sigi/apps/convenios/migrations/0021_projeto_texto_minuta_projeto_texto_oficio.py
new file mode 100644
index 0000000..8d7964a
--- /dev/null
+++ b/sigi/apps/convenios/migrations/0021_projeto_texto_minuta_projeto_texto_oficio.py
@@ -0,0 +1,24 @@
+# Generated by Django 4.0.4 on 2022-04-25 19:45
+
+from django.db import migrations
+import tinymce.models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('convenios', '0020_gescon_orgaos_gestores'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='projeto',
+ name='texto_minuta',
+ field=tinymce.models.HTMLField(blank=True, help_text='Use as seguintes marcações:
- {{ casa.nome }} para o nome da Casa Legislativa / órgão
- {{ casa.municipio.uf.sigla }} para a sigla da UF da Casa legislativa
- {{ presidente.nome }} para o nome do presidente
- {{ contato.nome }} para o nome do contato Interlegis
', verbose_name='texto da minuta'),
+ ),
+ migrations.AddField(
+ model_name='projeto',
+ name='texto_oficio',
+ field=tinymce.models.HTMLField(blank=True, help_text='Use as seguintes marcações:- {{ casa.nome }} para o nome da Casa Legislativa / órgão
- {{ casa.municipio.uf.sigla }} para a sigla da UF da Casa legislativa
- {{ presidente.nome }} para o nome do presidente
- {{ contato.nome }} para o nome do contato Interlegis
', verbose_name='texto do ofício'),
+ ),
+ ]
diff --git a/sigi/apps/convenios/models.py b/sigi/apps/convenios/models.py
index 22d6319..cc60452 100644
--- a/sigi/apps/convenios/models.py
+++ b/sigi/apps/convenios/models.py
@@ -7,14 +7,29 @@ from django.core.mail import send_mail
from django.urls import reverse
from django.utils.formats import date_format
from django.utils.translation import gettext as _
+from tinymce.models import HTMLField
from sigi.apps.utils import to_ascii
from sigi.apps.casas.models import Orgao
from sigi.apps.servidores.models import Servidor, Servico
class Projeto(models.Model):
+ MARKUP_HELP = _(
+ "Use as seguintes marcações:- {{ casa.nome }} para o"
+ " nome da Casa Legislativa / órgão
"
+ "- {{ casa.municipio.uf.sigla }} para a sigla da UF da "
+ "Casa legislativa
- {{ presidente.nome }} "
+ "para o nome do presidente
- {{ contato.nome }} para o nome "
+ "do contato Interlegis
"
+ )
nome = models.CharField(max_length=50)
sigla = models.CharField(max_length=10)
+ texto_oficio = HTMLField(
+ _("texto do ofício"), blank=True, help_text=MARKUP_HELP
+ )
+ texto_minuta = HTMLField(
+ _("texto da minuta"), blank=True, help_text=MARKUP_HELP
+ )
def __str__(self):
return self.sigla
diff --git a/sigi/apps/eventos/forms.py b/sigi/apps/eventos/forms.py
index 0d99e7c..b14da76 100644
--- a/sigi/apps/eventos/forms.py
+++ b/sigi/apps/eventos/forms.py
@@ -1,6 +1,8 @@
from django import forms
from django.utils.translation import gettext as _
-from sigi.apps.eventos.models import ModeloDeclaracao, Evento
+from material.admin.widgets import MaterialAdminTextareaWidget
+from sigi.apps.casas.models import Funcionario, Orgao
+from sigi.apps.eventos.models import Convite, ModeloDeclaracao, Evento
class EventoAdminForm(forms.ModelForm):
@@ -46,3 +48,34 @@ class SelecionaModeloForm(forms.Form):
required=True,
label=_("Modelo de declaração"),
)
+
+
+class ConviteForm(forms.ModelForm):
+ class Meta:
+ model = Convite
+ fields = ["nomes_participantes"]
+ widgets = {"nomes_participantes": MaterialAdminTextareaWidget}
+
+
+class CasaForm(forms.ModelForm):
+ class Meta:
+ model = Orgao
+ fields = ["cnpj", "logradouro", "bairro", "cep", "email", "brasao"]
+
+
+class FuncionarioForm(forms.ModelForm):
+ class Meta:
+ model = Funcionario
+ fields = [
+ "nome",
+ "sexo",
+ "cpf",
+ "identidade",
+ "nota",
+ "email",
+ "redes_sociais",
+ ]
+ widgets = {
+ "nota": MaterialAdminTextareaWidget,
+ "redes_sociais": MaterialAdminTextareaWidget,
+ }
diff --git a/sigi/apps/eventos/models.py b/sigi/apps/eventos/models.py
index 2962f82..9f980db 100644
--- a/sigi/apps/eventos/models.py
+++ b/sigi/apps/eventos/models.py
@@ -2,6 +2,7 @@ import re
from datetime import datetime
from django.db import models
from django.db.models import Sum
+from django.urls import reverse
from django.utils.translation import gettext as _
from sigi.apps.casas.models import Orgao
from sigi.apps.contatos.models import Municipio
@@ -110,6 +111,9 @@ class Evento(models.Model):
f"de {self.data_inicio} a {self.data_termino}"
)
+ def get_absolute_url(self):
+ return reverse("eventos-evento", args=[self.id])
+
def get_sigad_url(self):
m = re.match(
"(?P00100|00200)\.(?P\d{6})/(?P"
diff --git a/sigi/apps/eventos/templates/eventos/convida_casa.html b/sigi/apps/eventos/templates/eventos/convida_casa.html
new file mode 100644
index 0000000..0dc44ea
--- /dev/null
+++ b/sigi/apps/eventos/templates/eventos/convida_casa.html
@@ -0,0 +1,75 @@
+{% extends "admin/base_site.html" %}
+{% load i18n static %}
+
+{% block content %}
+{{ block.super }}
+
+{% endblock %}
\ No newline at end of file
diff --git a/sigi/apps/eventos/templates/eventos/evento.html b/sigi/apps/eventos/templates/eventos/evento.html
new file mode 100644
index 0000000..91042ef
--- /dev/null
+++ b/sigi/apps/eventos/templates/eventos/evento.html
@@ -0,0 +1,134 @@
+{% extends "admin/base_site.html" %}
+{% load i18n static model_fields %}
+
+{% block extrastyle %}
+ {{ block.super }}
+
+{% endblock %}
+{% block content %}
+{{ block.super }}
+
+
+
+
{{ evento.nome }}
+
+
+
+
+
+
+
+
+ {% for field_name in fields %}
+
+ {{ evento|verbose_name:field_name|title }} |
+ {{ evento|field_value:field_name }} |
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+
+
+ {% if evento.convite_set.count == 0 %}
+
{% trans "Nenhum convite registrado" %}
+ {% else %}
+
+
+
+ {% for field_name in convite_fields %}
+ {{ evento.convite_set.first|verbose_name:field_name|title }} |
+ {% endfor %}
+
+
+
+ {% for convite in evento.convite_set.all %}
+
+ {% for field_name in convite_fields %}
+ {{ convite|field_value:field_name }} |
+ {% endfor %}
+
+ {% endfor %}
+
+
+ {% endif %}
+
+
+
+
+
+
+ {% if anexos.count == 0 %}
+
{% trans "Nenhum anexo registrado" %}
+ {% else %}
+ {% if active %}
+
+ {% trans "Mostrando apenas anexos recem-criados" %}
+
+
{% trans "Ver todos" %}
+ {% endif %}
+
+
+
+ {% with anexos.first as anexo %}
+ {{ anexo|verbose_name:"descricao"|title }} |
+ {{ anexo|verbose_name:"data_pub"|title }} |
+ {{ anexo|verbose_name:"arquivo"|title }} |
+ {% endwith %}
+
+
+
+ {% for anexo in anexos.all %}
+
+ {{ anexo.descricao }} |
+ {{ anexo.data_pub|date:"SHORT_DATE_FORMAT" }} |
+
+
+ picture_as_pdf
+
+ |
+
+ {% endfor %}
+
+
+ {% endif %}
+
+
+
+
+
+{% endblock %}
+
+{% block footer %}
+{{ block.super }}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/sigi/apps/eventos/templates/eventos/minuta_pdf.html b/sigi/apps/eventos/templates/eventos/minuta_pdf.html
new file mode 100644
index 0000000..7561dcd
--- /dev/null
+++ b/sigi/apps/eventos/templates/eventos/minuta_pdf.html
@@ -0,0 +1,77 @@
+{% extends 'pdf/base_report.html' %}
+{% load i18n static %}
+
+{% block page_margin %}4cm 2cm{% endblock page_margin %}
+
+{% block page-header-settings %}
+@top-center { content: element(header);}
+{% endblock %}
+
+{% block page-footer-settings %}
+@bottom-center { content: element(footer); }
+{% endblock %}
+
+
+{% block extra_style %}
+ h1 {font-size: 1.2em;}
+ h2 {font-size: 1.1em;}
+ h3,h4,h5,h6 {font-size: 1em;}
+
+ header {
+ font-size: 1em;
+ text-align: center;
+ }
+
+ header p {
+ margin: 0 0 5px 0;
+ }
+
+ .strong {
+ font-weight: bold;
+ }
+
+ .header-title {
+ font-weight: bold;
+ font-size: 1.2em;
+ }
+
+ .header-subtitle {
+ font-weight: bold;
+ font-size: 1em;
+ }
+
+ .content {
+ font-size: 1.2em;
+ line-height: 1.4em;
+ padding-bottom: 5px;
+ }
+
+ footer {
+ width: 100%;
+ text-align: center;
+ }
+
+ .barra {
+ height: 15px;
+ }
+{% endblock %}
+
+{% block header %}
+
+
+
+
+{% endblock %}
+
+{% block main_content %}
+
+ {% block text_body %}{% endblock %}
+
+{% endblock %}
+
+{% block footer %}
+
+Instituto Legislativo Brasileiro - ILB - Av. N2 - Bloco 12 - CEP 70165-900 – Brasília DF
+Telefone: +55 (61) 3303-2599 – interlegis@senado.leg.br – www.interlegis.leg.br
+MINUTA-PADRÃO aprovada pela Diretoria-Geral do Senado Federal em 01/setembro/2021, conforme processo 00200.006818/2021-12.
+{% endblock %}
\ No newline at end of file
diff --git a/sigi/apps/eventos/templates/eventos/oficio_padrao.html b/sigi/apps/eventos/templates/eventos/oficio_padrao.html
new file mode 100644
index 0000000..66e5432
--- /dev/null
+++ b/sigi/apps/eventos/templates/eventos/oficio_padrao.html
@@ -0,0 +1,79 @@
+{% extends 'pdf/base_report.html' %}
+{% load i18n %}
+
+{% block page_margin %}4cm 2cm{% endblock page_margin %}
+
+{% block page-header-settings %}
+@top-left { content: element(logo);}
+@top-center { content: element(header);}
+{% endblock %}
+
+{% block page-footer-settings %}
+@bottom-center { content: element(footer); }
+{% endblock %}
+
+
+{% block extra_style %}
+ @media print {
+ .logo {position: running(logo);}
+ }
+
+ .logo-image {
+ display: block;
+ max-width: 120px;
+ max-height: 120px;
+ }
+
+ header {
+ font-size: 1em;
+ text-align: left;
+ }
+
+ header p {
+ margin: 5px 15px;
+ }
+
+ header h1 {
+ margin: 0 0 5px 0;
+ }
+
+ .strong {
+ font-weight: bold;
+ }
+
+ .content {
+ font-size: 1.2em;
+ line-height: 1.4em;
+ padding-bottom: 5px;
+ }
+
+ footer {
+ width: 100%;
+ text-align: center;
+ }
+{% endblock %}
+
+{% block body_content %}
+
+
+
+ {{ block.super }}
+{% endblock %}
+
+{% block header %}
+ {{ casa.nome }}
+ CNPJ: {{ casa.cnpj }}
+ {{ casa.logradouro }}, {{ casa.bairro }}
+ {{ casa.cep }} - {{ casa.municipio.nome }} - {{ casa.municipio.uf.nome }}
+{% endblock %}
+
+{% block main_content %}
+
+ {% block text_body %}{% endblock %}
+
+{% endblock %}
+
+{% block footer %}
+{{ casa.nome }} - {{ casa.logradouro }} - {{ casa.bairro }}
+{{ casa.cep }} - {{ casa.municipio.nome }}, {{ casa.municipio.uf.sigla }}
+{% endblock %}
\ No newline at end of file
diff --git a/sigi/apps/eventos/urls.py b/sigi/apps/eventos/urls.py
index 65054ee..2e4efa2 100644
--- a/sigi/apps/eventos/urls.py
+++ b/sigi/apps/eventos/urls.py
@@ -3,6 +3,12 @@ from sigi.apps.eventos import views
urlpatterns = [
path("calendario/", views.calendario, name="eventos-calendario"),
+ path("evento//", views.evento, name="eventos-evento"),
+ path(
+ "evento//convite//",
+ views.convida_casa,
+ name="eventos-evento-convida",
+ ),
path(
"evento//declaracao/",
views.declaracao,
diff --git a/sigi/apps/eventos/views.py b/sigi/apps/eventos/views.py
index 5bc7a38..0365343 100644
--- a/sigi/apps/eventos/views.py
+++ b/sigi/apps/eventos/views.py
@@ -1,16 +1,26 @@
import calendar
import datetime
import locale
+from django.contrib import messages
from django.contrib.admin.sites import site
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
-from django.shortcuts import render, get_object_or_404
+from django.shortcuts import redirect, render, get_object_or_404
from django.template import Template, Context
+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 weasyprint import HTML
-from sigi.apps.eventos.models import Evento, Equipe, Convite, Modulo
-from sigi.apps.eventos.forms import SelecionaModeloForm
+from sigi.apps.casas.models import Funcionario, Orgao, Presidente
+from sigi.apps.convenios.models import Projeto
+from sigi.apps.eventos.models import Evento, Equipe, Convite, Modulo, Anexo
+from sigi.apps.eventos.forms import (
+ SelecionaModeloForm,
+ ConviteForm,
+ CasaForm,
+ FuncionarioForm,
+)
from sigi.apps.servidores.models import Servidor
@@ -46,6 +56,191 @@ def calendario(request):
return render(request, "eventos/calendario.html", context)
+def evento(request, id):
+ context = site.each_context(request)
+ evento = get_object_or_404(Evento, id=id)
+ anexo_id = request.GET.getlist("anexo_id", None)
+ if anexo_id:
+ context["anexos"] = evento.anexo_set.filter(id__in=anexo_id)
+ context["active"] = "anexos"
+ else:
+ context["anexos"] = evento.anexo_set.all()
+
+ context["evento"] = evento
+ context["fields"] = [
+ "tipo_evento",
+ "descricao",
+ "virtual",
+ "publico_alvo",
+ "data_inicio",
+ "data_termino",
+ "carga_horaria",
+ "casa_anfitria",
+ "municipio",
+ "local",
+ ]
+ context["convite_fields"] = [
+ "casa",
+ "servidor",
+ "data_convite",
+ "aceite",
+ "participou",
+ "nomes_participantes",
+ ]
+ context["anexo_fields"] = ["descricao", "data_pub", "arquivo"]
+
+ return render(request, "eventos/evento.html", context)
+
+
+def convida_casa(request, evento_id, casa_id):
+ if not request.user.servidor:
+ messages.error(
+ request, _("Você não é servidor, não pode registrar convites")
+ )
+ return redirect(evento)
+
+ evento = get_object_or_404(Evento, id=evento_id)
+ casa = get_object_or_404(Orgao, id=casa_id)
+
+ projetos = Projeto.objects.exclude(texto_minuta="")
+
+ if evento.convite_set.filter(casa=casa).exists():
+ convite = evento.convite_set.get(casa=casa)
+ else:
+ convite = Convite(
+ evento=evento,
+ casa=casa,
+ servidor=request.user.servidor,
+ data_convite=datetime.date.today(),
+ )
+
+ presidente = casa.presidente or Funcionario(
+ casa_legislativa=casa, setor="presidente"
+ )
+ contato = casa.contato_interlegis or Funcionario(
+ casa_legislativa=casa, setor="contato_interlegis"
+ )
+
+ if request.method == "POST":
+ form_convite = ConviteForm(request.POST, instance=convite)
+ form_casa = CasaForm(request.POST, request.FILES, instance=casa)
+ form_presidente = FuncionarioForm(
+ request.POST, instance=presidente, prefix="presidente"
+ )
+ form_contato = FuncionarioForm(
+ request.POST, instance=contato, prefix="contato"
+ )
+
+ if all(
+ [
+ form_convite.is_valid(),
+ form_casa.is_valid(),
+ form_presidente.is_valid(),
+ form_contato.is_valid(),
+ ]
+ ):
+ contato = form_contato.save()
+ presidente = form_presidente.save()
+ casa = form_casa.save()
+ convite = form_convite.save()
+
+ proj_id = request.POST.get("save", "")
+
+ if proj_id:
+ query_str = ""
+ projeto = get_object_or_404(Projeto, id=proj_id)
+ if projeto.texto_oficio:
+ oficio = gerar_anexo(
+ casa,
+ presidente,
+ contato,
+ path=request.build_absolute_uri("/"),
+ nome=f"Ofício de solicitação de {projeto.sigla}",
+ modelo="oficio_padrao.html",
+ texto=projeto.texto_oficio,
+ )
+ oficio.evento = evento
+ oficio.save()
+ query_str += f"anexo_id={oficio.id}&"
+ if projeto.texto_minuta:
+ minuta = gerar_anexo(
+ casa,
+ presidente,
+ contato,
+ path=request.build_absolute_uri("/"),
+ nome=f"Minuta de {projeto.sigla}",
+ modelo="minuta_pdf.html",
+ texto=projeto.texto_minuta,
+ )
+ minuta.evento = evento
+ minuta.save()
+ query_str += f"anexo_id={minuta.id}"
+
+ return redirect(evento.get_absolute_url() + "?" + query_str)
+ else:
+ return redirect(evento.get_absolute_url())
+ else:
+ messages.error(_("Preencha corretamente o convite"))
+ else:
+ form_convite = ConviteForm(instance=convite)
+ form_casa = CasaForm(instance=casa)
+ form_presidente = FuncionarioForm(
+ instance=presidente, prefix="presidente"
+ )
+ form_contato = FuncionarioForm(instance=contato, prefix="contato")
+
+ context = site.each_context(request)
+ context.update(
+ {
+ "form_convite": form_convite,
+ "form_casa": form_casa,
+ "form_presidente": form_presidente,
+ "form_contato": form_contato,
+ "evento": evento,
+ "convite": convite,
+ "casa": casa,
+ "presidente": presidente,
+ "contato": contato,
+ "projetos": projetos,
+ }
+ )
+
+ return render(request, "eventos/convida_casa.html", context)
+
+
+def gerar_anexo(casa, presidente, contato, path, modelo, nome, texto):
+ template_string = (
+ f'{{% extends "eventos/{modelo}" %}}'
+ "{% load pdf %}"
+ f"{{% block text_body %}}{texto}{{% endblock %}}"
+ )
+ context = Context(
+ {
+ "evento": evento,
+ "casa": casa,
+ "presidente": presidente,
+ "contato": contato,
+ "data": datetime.date.today(),
+ "doravante": casa.tipo.nome.split(" ")[0],
+ }
+ )
+ string = Template(template_string).render(context)
+ pdf = HTML(
+ string=string,
+ url_fetcher=django_url_fetcher,
+ encoding="utf-8",
+ base_url=path,
+ )
+ nome = (nome + f" da {casa.nome}")[:70]
+ anexo = Anexo(descricao=nome)
+ anexo.arquivo.name = slugify(nome) + ".pdf"
+ f = anexo.arquivo.open("wb")
+ pdf.write_pdf(target=f)
+ f.flush()
+ f.close()
+ return anexo
+
+
# @login_required
# def calendario(request):
# mes_pesquisa = int(request.GET.get('mes', datetime.date.today().month))
diff --git a/sigi/apps/home/templates/home/mapfilter.html b/sigi/apps/home/templates/home/mapfilter.html
index ea9168b..2d7253e 100644
--- a/sigi/apps/home/templates/home/mapfilter.html
+++ b/sigi/apps/home/templates/home/mapfilter.html
@@ -4,7 +4,7 @@
{% if not mobile %}
close
{% endif %}
-