diff --git a/sigi/apps/casas/admin_urls.py b/sigi/apps/casas/admin_urls.py
new file mode 100644
index 0000000..1d5e66f
--- /dev/null
+++ b/sigi/apps/casas/admin_urls.py
@@ -0,0 +1,6 @@
+from django.urls import path, include
+from sigi.apps.casas import views
+
+urlpatterns = [
+ path("carteira/", views.painel_relacionamento, name="casas_carteira"),
+]
diff --git a/sigi/apps/casas/forms.py b/sigi/apps/casas/forms.py
index f5e24fc..86fb4c9 100644
--- a/sigi/apps/casas/forms.py
+++ b/sigi/apps/casas/forms.py
@@ -1,8 +1,8 @@
from django import forms
from django.utils.translation import gettext as _
from localflavor.br.forms import BRZipCodeField
-
-from sigi.apps.casas.models import Orgao
+from material.admin.widgets import MaterialAdminTextareaWidget
+from sigi.apps.casas.models import Funcionario, Orgao
from sigi.apps.servidores.models import Servidor
@@ -15,11 +15,6 @@ class AtualizaCasaForm(forms.Form):
class OrgaoForm(forms.ModelForm):
- # cnpj = BRCNPJField(
- # label=_('CNPJ'),
- # required=False,
- # help_text=_('Utilize o formato XX.XXX.XXX/XXXX-XX ou insira apenas os dígitos.')
- # )
cep = BRZipCodeField(
label=_("CEP"), help_text=_("Formato") + ": XXXXX-XXX."
)
@@ -28,13 +23,6 @@ class OrgaoForm(forms.ModelForm):
model = Orgao
fields = "__all__"
- # def clean(self):
- # cleaned_data = super(OrgaoForm, self).clean()
- # tipo = cleaned_data.get('tipo')
- # municipio = cleaned_data.get('municipio')
- # if tipo.legislativo:
- # if Orgao.objects.filter(tipo=tipo)
-
class PortfolioForm(forms.Form):
ACAO_CHOICES = (("ADD", _("Adicionar")), ("DEL", _("Remover")))
@@ -52,3 +40,25 @@ class PortfolioForm(forms.Form):
def __init__(self, label=_("Atribuir para"), *args, **kwargs):
super(PortfolioForm, self).__init__(*args, **kwargs)
self.fields["gerente"].label = label
+
+
+class FuncionarioForm(forms.ModelForm):
+ class Meta:
+ model = Funcionario
+ fields = [
+ "nome",
+ "cpf",
+ "identidade",
+ "sexo",
+ "data_nascimento",
+ "setor",
+ "cargo",
+ "funcao",
+ "tempo_de_servico",
+ "nota",
+ "email",
+ "redes_sociais",
+ ]
+ widgets = {
+ "redes_sociais": MaterialAdminTextareaWidget,
+ }
diff --git a/sigi/apps/casas/templates/casas/casas_sem_convenio_pdf.html b/sigi/apps/casas/templates/casas/casas_sem_convenio_pdf.html
deleted file mode 100644
index 2d6abe8..0000000
--- a/sigi/apps/casas/templates/casas/casas_sem_convenio_pdf.html
+++ /dev/null
@@ -1,37 +0,0 @@
-{% extends 'pdf/base_report.html' %}
-{% load static i18n %}
-
-{% block page_size %}A4 landscape{% endblock %}
-
-{% block main_content %}
-
-
-
- {% trans 'Casa' %} |
- {% trans 'Presidente' %} |
- {% trans 'Tipo' %} |
- {% trans 'Endereço' %} |
- {% trans 'Bairro' %} |
- {% trans 'CEP' %} |
- {% trans 'Telefone' %} |
- {% trans 'E-mail' %} |
-
-
-
- {% for casa in casas %}
- {% ifchanged casa.municipio.uf %}
- {{ casa.municipio.uf.nome }} |
- {% endifchanged %}
-
- {{ casa.nome }} |
- {{ casa.presidente }} |
- {{ casa.tipo.sigla }} |
- {{ casa.logradouro }} |
- {{ casa.bairro }} |
- {{ casa.cep }} |
- {{ casa.telefone }} |
- {{ casa.email }} |
-
- {% endfor %}
-
-{% endblock main_content %}
\ No newline at end of file
diff --git a/sigi/apps/casas/templates/casas/lista_casas_carteira_snippet.html b/sigi/apps/casas/templates/casas/lista_casas_carteira_snippet.html
index 0b2e4d7..6560fad 100644
--- a/sigi/apps/casas/templates/casas/lista_casas_carteira_snippet.html
+++ b/sigi/apps/casas/templates/casas/lista_casas_carteira_snippet.html
@@ -26,27 +26,27 @@
{% endif %}
diff --git a/sigi/apps/casas/templates/casas/painel.html b/sigi/apps/casas/templates/casas/painel.html
index cefb501..d6bb735 100644
--- a/sigi/apps/casas/templates/casas/painel.html
+++ b/sigi/apps/casas/templates/casas/painel.html
@@ -46,7 +46,7 @@ $(document).ready(function(){
function filter_list( e ) {
e.preventDefault();
var form_data = $("form[name='servico-form']").serialize();
- $("#lista").load("{% url "casas-carteira" %}?snippet=lista&"+form_data, listeners);
+ $("#lista").load("{% url "casas_carteira" %}?snippet=lista&"+form_data, listeners);
}
});
diff --git a/sigi/apps/casas/templates/casas/resumo_carteira_snippet.html b/sigi/apps/casas/templates/casas/resumo_carteira_snippet.html
index 95ff470..63a3e2a 100644
--- a/sigi/apps/casas/templates/casas/resumo_carteira_snippet.html
+++ b/sigi/apps/casas/templates/casas/resumo_carteira_snippet.html
@@ -19,13 +19,13 @@
-
-
+
{% trans "Todo o Interlegis" %}
{% for g in gerentes %}
-
-
+
{{g.nome_completo }}
diff --git a/sigi/apps/casas/templates/public/casas/funcionario_delete.html b/sigi/apps/casas/templates/public/casas/funcionario_delete.html
new file mode 100644
index 0000000..638551e
--- /dev/null
+++ b/sigi/apps/casas/templates/public/casas/funcionario_delete.html
@@ -0,0 +1,35 @@
+{% extends 'public/base_site.html' %}
+{% load i18n %}
+
+{% block content %}
+ {{ block.super }}
+
+{% endblock %}
diff --git a/sigi/apps/casas/templates/public/casas/funcionario_list.html b/sigi/apps/casas/templates/public/casas/funcionario_list.html
new file mode 100644
index 0000000..2f00fb0
--- /dev/null
+++ b/sigi/apps/casas/templates/public/casas/funcionario_list.html
@@ -0,0 +1,67 @@
+{% extends 'public/base_site.html' %}
+{% load i18n %}
+
+{% block extrastyle %}
+ {{ block.super }}
+
+{% endblock extrastyle %}
+
+{% block content %}
+ {{ block.super }}
+
+
+
+
+
+
+ {% trans 'Setor' %} |
+ {% trans 'Nome' %} |
+ {% trans 'CPF' %} |
+ {% trans 'Telefones' %} |
+ {% trans 'E-mail' %} |
+
+ {% for funcionario in object_list %}
+
+ {{ funcionario.get_setor_display }} |
+ {{ funcionario.nome }} |
+ {{ funcionario.cpf }} |
+ {{ funcionario.nota }} |
+ {{ funcionario.email }} |
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/sigi/apps/casas/templates/public/casas/funcionario_update.html b/sigi/apps/casas/templates/public/casas/funcionario_update.html
new file mode 100644
index 0000000..6992fa3
--- /dev/null
+++ b/sigi/apps/casas/templates/public/casas/funcionario_update.html
@@ -0,0 +1,34 @@
+{% extends 'public/base_site.html' %}
+{% load i18n %}
+
+{% block extrahead %}
+ {{ block.super }}
+ {{ form.media }}
+{% endblock extrahead %}
+
+{% block content %}
+ {{ block.super }}
+
+{% endblock %}
diff --git a/sigi/apps/casas/templates/public/casas/orgao_update.html b/sigi/apps/casas/templates/public/casas/orgao_update.html
new file mode 100644
index 0000000..8cd3bfa
--- /dev/null
+++ b/sigi/apps/casas/templates/public/casas/orgao_update.html
@@ -0,0 +1,28 @@
+{% extends 'public/base_site.html' %}
+{% load i18n static %}
+
+{% block extrahead %}
+ {{ block.super }}
+ {{ form.media }}
+{% endblock extrahead %}
+
+{% block content %}
+ {{ block.super }}
+
+{% endblock %}
diff --git a/sigi/apps/casas/urls.py b/sigi/apps/casas/urls.py
index 6d0288d..9b19620 100644
--- a/sigi/apps/casas/urls.py
+++ b/sigi/apps/casas/urls.py
@@ -1,71 +1,28 @@
from django.urls import path, include
from sigi.apps.casas import views
+app_name = "casas"
+
urlpatterns = [
+ path("orgao/update/", views.CasaUpdateView.as_view(), name="orgao_update"),
+ path(
+ "funcionario/",
+ views.FuncionarioListView.as_view(),
+ name="funcionario_listview",
+ ),
+ path(
+ "funcionario/create/",
+ views.FuncionarioCreateView.as_view(),
+ name="funcionario_create",
+ ),
path(
- "orgao/casas_sem_convenio_report/",
- views.CasasSemConvenioReport.as_view(),
- name="casas-sem-convenio-report",
+ "funcionario//",
+ views.FuncionarioUpdateView.as_view(),
+ name="funcionario_update",
+ ),
+ path(
+ "funcionario//delete/",
+ views.FuncionarioDeleteView.as_view(),
+ name="funcionario_delete",
),
- path("carteira/", views.painel_relacionamento, name="casas-carteira"),
]
-
-
-"""
-from django.conf.urls import patterns, url
-from django.contrib.auth.decorators import login_required
-from sigi.apps.casas.views import importa_casas
-
-
-urlpatterns = patterns(
- 'sigi.apps.casas.views',
-
- # Informacoes de uma casa legislativa
- url(r'^orgao/report_complete/$', 'report_complete',
- name='report-complete-all'),
- url(r'^orgao/(?P\w+)/report_complete/$', 'report_complete',
- name='report-complete-id'),
-
- # Reports Labels
- url(r'^orgao/labels/$', 'labels_report', name='labels-report-all'),
- url(r'^orgao/(?P\w+)/labels/$', 'labels_report',
- name='labels-report-id'),
-
- # Reports Labels Parlamentar
- url(r'^orgao/labels_parlamentar/$', 'labels_report_parlamentar',
- name='lebels-report-parlamentar-all'),
- url(r'^orgao/(?P\w+)/labels_parlamentar/$', 'labels_report_parlamentar',
- name='labels-report-parlamentar-id'),
-
-
- # Reports labels sem presidente
- url(r'^orgao/labels_sem_presidente/$', 'labels_report_sem_presidente',
- name='labels-report-sem-presidente-all'),
- url(r'^orgao/(?P\w+)/labels_sem_presidente/$',
- 'labels_report_sem_presidente', name='labels-report-sem-presidente-id'),
-
- # Reports casas sem convenio
- url(r'^orgao/reports/$', 'report', name='casa-report'),
- url(r'^orgao/casas_sem_convenio_report/$', 'casas_sem_convenio_report',
- name='casas-sem-convenio-report'),
-
- # CSV
- url(r'^orgao/csv/$', 'export_csv', name='casa-export-csv'), # Error
-
- # Carrinho
- url(r'^orgao/carrinho/$', 'visualizar_carrinho',
- name='visualizar-carrinho'),
- url(r'^orgao/carrinho/excluir_carrinho/$', 'excluir_carrinho',
- name='excluir-carrinho'), # Error
- url(r'^orgao/carrinho/deleta_itens_carrinho$', 'deleta_itens_carrinho',
- name='deleta-itens-carrinho'), # Error
- url(r'^portfolio/$', 'portfolio', name='casas-portfolio'),
- url(r'^carteira/$', 'painel_relacionamento', name='casas-carteira'),
-
- # Atualização por CSV
- url(r'^orgao/importa/$', login_required(importa_casas.as_view()),
- name='importar-casas'),
- url(r'^gerentes/$', 'gerentes_interlegis',
- name='gerentes_interlegis'),
-)
-"""
diff --git a/sigi/apps/casas/views.py b/sigi/apps/casas/views.py
index c2ab642..9d70550 100644
--- a/sigi/apps/casas/views.py
+++ b/sigi/apps/casas/views.py
@@ -1,913 +1,30 @@
import csv
from functools import reduce
from django.db.models import Count, Q
+from django.contrib.admin.sites import site
+from django.contrib.admin.views.decorators import staff_member_required
+from django.contrib.auth import get_user_model
from django.contrib.auth.decorators import login_required
+from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.paginator import Paginator, InvalidPage, EmptyPage
-from django.http import (
- HttpResponse,
- HttpResponseRedirect,
-)
+from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, get_object_or_404
-from django.utils.translation import gettext as _, ngettext
-from django_weasyprint.views import WeasyTemplateView
-from sigi.apps.casas.forms import PortfolioForm, AtualizaCasaForm
-from sigi.apps.casas.models import Orgao, TipoOrgao, Funcionario
+from django.urls import reverse_lazy
+from django.utils.translation import gettext as _
+from django.views.generic import CreateView, DeleteView, ListView, UpdateView
+from sigi.apps.casas.forms import FuncionarioForm
+from sigi.apps.casas.models import Funcionario, Orgao
+from sigi.apps.home.mixins import ContatoInterlegisViewMixin
from sigi.apps.servidores.models import Servidor
-
-# from sigi.shortcuts import render_to_pdf
-# from sigi.apps.casas.reports import (CasasLegislativasLabels,
-# CasasLegislativasLabelsSemPresidente)
from sigi.apps.contatos.models import (
UnidadeFederativa,
Mesorregiao,
Microrregiao,
)
-
-# , Municipio
from sigi.apps.ocorrencias.models import Ocorrencia
-
-# from sigi.apps.parlamentares.reports import ParlamentaresLabels
from sigi.apps.servicos.models import TipoServico
-class CasasSemConvenioReport(WeasyTemplateView):
- template_name = "casas/casas_sem_convenio_pdf.html"
- pdf_filename = "casas_sem_convenio.pdf"
-
- def get_context_data(self, **kwargs):
- qs = Orgao.objects.filter(convenio=None).order_by(
- "municipio__uf", "nome"
- )
- qs = Orgao.objects.order_by("municipio__uf", "nome")
-
- if self.request.GET:
- qs = get_for_qs(self.request.GET, qs)
- if not qs:
- return HttpResponseRedirect("../")
-
- qs = qs.order_by("municipio__uf", "nome")
- return {"casas": qs, "title": _("Casas sem convênio")}
-
-
-def get_for_qs(get, qs):
- kwargs = {}
- for k, v in get.items():
- if str(k) not in ("page", "pop", "q", "_popup", "o", "ot"):
- kwargs[str(k)] = v
-
- # if 'convenio' in kwargs:
- # if kwargs['convenio'] == 'SC':
- # qs = qs.filter(convenio=None)
- # elif kwargs['convenio'] == 'CC':
- # qs = qs.exclude(convenio=None)
- # else:
- # qs = qs.filter(convenio__projeto_id=kwargs['convenio'])
-
- # qs = qs.distinct('municipio__uf__nome', 'nome')
- # del(kwargs['convenio'])
-
- # if 'servico' in kwargs:
- # if kwargs['servico'] == 'SS':
- # qs = qs.filter(servico=None)
- # elif kwargs['servico'] == 'CS':
- # qs = qs.exclude(servico=None).filter(
- # servico__data_desativacao__isnull=True)
- # elif kwargs['servico'] == 'CR':
- # qs = qs.exclude(servico__tipo_servico__modo='H') \
- # .exclude(servico=None)
- # elif kwargs['servico'] == 'CH':
- # qs = qs.filter(
- # servico__tipo_servico__modo='H',
- # servico__data_desativacao__isnull=True
- # )
- # else:
- # qs = qs.filter(servico__tipo_servico_id=kwargs['servico'])
-
- # qs = qs.distinct('municipio__uf__nome', 'nome')
-
- # del(kwargs['servico'])
-
- qs = qs.filter(**kwargs)
- if "o" in get:
- qs = query_ordena(qs, get["o"])
-
- return qs
-
-
-# @param qs: queryset
-# @param o: (int) number of order field
-def query_ordena(qs, o):
- from sigi.apps.casas.admin import OrgaoAdmin
-
- list_display = OrgaoAdmin.list_display
- order_fields = []
-
- for order_number in o.split("."):
- order_number = int(order_number)
- order = ""
- if order_number != abs(order_number):
- order_number = abs(order_number)
- order = "-"
- order_fields.append(order + list_display[order_number - 1])
-
- qs = qs.order_by(*order_fields)
- return qs
-
-
-# class importa_casas(View):
-# errors = []
-# total_registros = 0
-
-# TIPO = 'tipo'
-# MUNICIPIO = 'municipio'
-# UF = 'uf'
-# ORGAO_ENDERECO = 'orgao_endereco'
-# ORGAO_BAIRRO = 'orgao_bairro'
-# ORGAO_CEP = 'orgao_cep'
-# ORGAO_EMAIL = 'orgao_email'
-# ORGAO_PORTAL = 'orgao_portal'
-# ORGAO_TELEFONES = 'orgao_telefones'
-# PRESIDENTE_NOME = 'presidente_nome'
-# PRESIDENTE_DATA_NASCIMENTO = 'presidente_data_nascimento'
-# PRESIDENTE_TELEFONES = 'presidente_telefones'
-# PRESIDENTE_EMAILS = 'presidente_emails'
-# PRESIDENTE_ENDERECO = 'presidente_endereco'
-# PRESIDENTE_MUNICIPIO = 'presidente_municipio'
-# PRESIDENTE_BAIRRO = 'presidente_bairro'
-# PRESIDENTE_CEP = 'presidente_cep'
-# PRESIDENTE_REDES_SOCIAIS = 'presidente_redes_sociais'
-# SERVIDOR_NOME = 'contato_nome'
-# SERVIDOR_DATA_NASCIMENTO = 'contato_data_nascimento'
-# SERVIDOR_TELEFONES = 'contato_telefones'
-# SERVIDOR_EMAILS = 'contato_emails'
-# SERVIDOR_ENDERECO = 'contato_endereco'
-# SERVIDOR_MUNICIPIO = 'contato_municipio'
-# SERVIDOR_BAIRRO = 'contato_bairro'
-# SERVIDOR_CEP = 'contato_cep'
-# SERVIDOR_REDES_SOCIAIS = 'contato_redes_sociais'
-# ERROS = 'erros_importacao'
-
-# fieldnames = [TIPO, MUNICIPIO, UF, ORGAO_ENDERECO, ORGAO_BAIRRO, ORGAO_CEP,
-# ORGAO_EMAIL, ORGAO_PORTAL, ORGAO_TELEFONES, PRESIDENTE_NOME,
-# PRESIDENTE_DATA_NASCIMENTO, PRESIDENTE_TELEFONES,
-# PRESIDENTE_EMAILS, PRESIDENTE_ENDERECO, PRESIDENTE_MUNICIPIO,
-# PRESIDENTE_BAIRRO, PRESIDENTE_CEP, PRESIDENTE_REDES_SOCIAIS,
-# SERVIDOR_NOME, SERVIDOR_DATA_NASCIMENTO, SERVIDOR_TELEFONES,
-# SERVIDOR_EMAILS, SERVIDOR_ENDERECO, SERVIDOR_MUNICIPIO,
-# SERVIDOR_BAIRRO, SERVIDOR_CEP, SERVIDOR_REDES_SOCIAIS, ERROS,]
-
-# ID_FIELDS = {TIPO, MUNICIPIO, UF}
-
-# ORGAO_FIELDS = {
-# ORGAO_ENDERECO: 'logradouro',
-# ORGAO_BAIRRO: 'bairro',
-# ORGAO_CEP: 'cep',
-# ORGAO_EMAIL: 'email',
-# ORGAO_PORTAL: 'pagina_web',
-# ORGAO_TELEFONES: 'telefones',
-# }
-
-# PRESIDENTE_FIELDS = {
-# PRESIDENTE_NOME: 'nome',
-# PRESIDENTE_DATA_NASCIMENTO: 'data_nascimento',
-# PRESIDENTE_TELEFONES: 'nota',
-# PRESIDENTE_EMAILS: 'email',
-# PRESIDENTE_ENDERECO: 'endereco',
-# PRESIDENTE_MUNICIPIO: 'municipio_id',
-# PRESIDENTE_BAIRRO: 'bairro',
-# PRESIDENTE_CEP: 'cep',
-# PRESIDENTE_REDES_SOCIAIS: 'redes_sociais',
-# }
-
-# SERVIDOR_FIELDS = {
-# SERVIDOR_NOME: 'nome',
-# SERVIDOR_DATA_NASCIMENTO: 'data_nascimento',
-# SERVIDOR_TELEFONES: 'nota',
-# SERVIDOR_EMAILS: 'email',
-# SERVIDOR_ENDERECO: 'endereco',
-# SERVIDOR_MUNICIPIO: 'municipio_id',
-# SERVIDOR_BAIRRO: 'bairro',
-# SERVIDOR_CEP: 'cep',
-# SERVIDOR_REDES_SOCIAIS: 'redes_sociais',
-# }
-
-# def get(self, request):
-# if not request.user.is_superuser:
-# return HttpResponseForbidden()
-
-# form = AtualizaCasaForm()
-# return render(request, 'casas/importar.html', {'form': form})
-
-# def post(self, request):
-# if not request.user.is_superuser:
-# return HttpResponseForbidden()
-
-# form = AtualizaCasaForm(request.POST, request.FILES)
-
-# if form.is_valid():
-# file = form.cleaned_data['arquivo']
-# reader = csv.DictReader(file)
-# if not self.ID_FIELDS.issubset(reader.fieldnames):
-# return render(
-# request,
-# 'casas/importar.html',
-# {'form': form, 'error': _("O arquivo não possui algum dos "
-# "campos obrigatórios")}
-# )
-
-# if self.importa(reader):
-# # Importação concluída com êxito
-# return render(
-# request,
-# 'casas/importar_result.html',
-# {'file_name': file.name, 'total': self.total_registros,
-# 'com_erros': 0}
-# )
-# else:
-# # Importado com erros
-# file_name = "casas-erros-{:%Y-%m-%d-%H%M}.csv".format(
-# datetime.now())
-# fields = self.fieldnames
-# for f in reader.fieldnames:
-# if f not in fields:
-# fields.append(f)
-# with open(settings.MEDIA_ROOT+'/temp/'+file_name, "w+") as f:
-# writer = csv.DictWriter(f, fieldnames=fields)
-# writer.writeheader()
-# writer.writerows(self.errors)
-# return render(
-# request,
-# 'casas/importar_result.html',
-# {'file_name': file.name, 'result_file': file_name,
-# 'total': self.total_registros,
-# 'com_erros': len(self.errors)}
-# )
-
-# response = HttpResponse(content_type='text/csv')
-# response['Content-Disposition'] = (
-# 'attachment; filename="somefilename.csv"')
-# return response
-# else:
-# return render(
-# request,
-# 'casas/importar.html',
-# {'form': form, 'error': "Erro no preenchimento do formulário."}
-# )
-
-# # Atualiza ou cria funcionário
-# def funcionario_update(self, setor, fields, orgao, reg):
-# field_nome = (self.PRESIDENTE_NOME if setor == 'presidente' else
-# self.SERVIDOR_NOME)
-
-# # Se não tem nome do contato (ou presidente), então não há nada a
-# # atualizar. Volta o reg inalterado.
-# if field_nome not in reg:
-# return reg
-
-# funcionario = orgao.funcionario_set.filter(
-# setor=setor,
-# nome__iexact=reg[field_nome].strip()
-# )
-
-# if funcionario.count() == 0:
-# funcionario = Funcionario(
-# casa_legislativa=orgao,
-# nome=reg[field_nome].strip(),
-# setor=setor
-# )
-# else:
-# funcionario = funcionario.first() #HACK: Sempre atualiza o primeiro
-
-# for key in fields:
-# field_name = fields[key]
-# if key in reg:
-# value = reg[key].strip()
-# else:
-# value = ""
-
-# if value != "":
-# if field_name == 'municipio_id':
-# if ',' in value:
-# municipio, uf = value.split(',')
-# else:
-# municipio = value
-# uf = reg[self.UF]
-
-# try:
-# value = Municipio.objects.get(
-# nome__iexact=municipio.strip(),
-# uf__sigla=uf.strip()).pk
-# except:
-# value = None
-# reg[self.ERROS].append(
-# "Impossivel identificar o Municipio de "
-# "residencia do {contato}".format(
-# contato="Presidente" if setor == 'presidente'
-# else "Contato")
-# )
-# continue
-# if field_name == 'redes_sociais':
-# value = value.replace(" ", "\r")
-# if field_name == 'data_nascimento':
-# sd = value.split('/')
-# if len(sd) < 3:
-# reg[self.ERROS].append(
-# "Data de nascimento do {contato} esta em um "
-# "formato nao reconhecido. Use DD/MM/AAAA".format(
-# contato="Presidente" if setor == 'presidente'
-# else "Contato"
-# )
-# )
-# continue
-# else:
-# value = "{ano}-{mes}-{dia}".format(
-# ano=sd[2],
-# mes=sd[1],
-# dia=sd[0]
-# )
-# if value != getattr(funcionario, field_name):
-# setattr(funcionario, field_name, value)
-# try:
-# funcionario.save()
-# except Exception as e:
-# reg[self.ERROS].append(
-# "Erro salvando {contato}: '{message}'".format(
-# message=e.message,
-# contato="Presidente" if setor == 'presidente'
-# else "Contato")
-# )
-
-# return reg
-
-# def importa(self, reader):
-# self.errors = []
-# self.total_registros = 0
-
-# for reg in reader:
-# self.total_registros += 1
-# reg[self.ERROS] = []
-# nome_orgao = to_ascii(reg[self.MUNICIPIO])
-# orgao = Orgao.objects.filter(
-# tipo__sigla=reg[self.TIPO],
-# municipio__search_text__icontains=nome_orgao,
-# municipio__uf__sigla=reg[self.UF]
-# )
-# if orgao.count() == 0:
-# reg[self.ERROS].append("Nao existe orgao com esta identificacao")
-# self.errors.append(reg)
-# continue
-# elif orgao.count() > 1:
-# reg[self.ERROS].append("Existem {count} orgaos com esta mesma "
-# "identificacao").format(count=orgao.count())
-# self.errors.append(reg)
-# continue
-# else:
-# orgao = orgao.get()
-
-# # Atualiza os dados do órgão
-# for key in self.ORGAO_FIELDS:
-# field_name = self.ORGAO_FIELDS[key]
-# if key in reg:
-# value = reg[key].strip()
-# if key == self.ORGAO_TELEFONES:
-# for numero in value.split(";"):
-# numero = numero.strip()
-# try:
-# orgao.telefones.update_or_create(numero=numero)
-# except:
-# reg[self.ERROS].append(
-# 'Telefone {numero} não foi '
-# 'atualizado'.format(numero=numero)
-# )
-# elif value != "" and value != getattr(orgao, field_name):
-# setattr(orgao, field_name, value)
-# try:
-# orgao.save()
-# except Exception as e:
-# reg[self.ERROS].append(
-# "Erro salvando o orgao: '{message}'".format(
-# message=e.message)
-# )
-
-# # Atualiza o presidente
-# reg = self.funcionario_update("presidente", self.PRESIDENTE_FIELDS,
-# orgao, reg)
-
-# # Atualiza o contato
-# reg = self.funcionario_update("outros", self.SERVIDOR_FIELDS,
-# orgao, reg)
-
-# if len(reg[self.ERROS]) > 0:
-# self.errors.append(reg)
-
-# return len(self.errors) == 0
-
-
-# def get_for_qs(get, qs):
-# """
-# Verifica atributos do GET e retorna queryset correspondente
-# """
-# kwargs = {}
-# for k, v in get.iteritems():
-# if str(k) not in ('page', 'pop', 'q', '_popup', 'o', 'ot'):
-# kwargs[str(k)] = v
-
-# if 'convenio' in kwargs:
-# if kwargs['convenio'] == 'SC':
-# qs = qs.filter(convenio=None)
-# elif kwargs['convenio'] == 'CC':
-# qs = qs.exclude(convenio=None)
-# else:
-# qs = qs.filter(convenio__projeto_id=kwargs['convenio'])
-
-# qs = qs.distinct('municipio__uf__nome', 'nome')
-# del(kwargs['convenio'])
-
-# if 'servico' in kwargs:
-# if kwargs['servico'] == 'SS':
-# qs = qs.filter(servico=None)
-# elif kwargs['servico'] == 'CS':
-# qs = qs.exclude(servico=None).filter(
-# servico__data_desativacao__isnull=True)
-# elif kwargs['servico'] == 'CR':
-# qs = qs.exclude(servico__tipo_servico__modo='H') \
-# .exclude(servico=None)
-# elif kwargs['servico'] == 'CH':
-# qs = qs.filter(
-# servico__tipo_servico__modo='H',
-# servico__data_desativacao__isnull=True
-# )
-# else:
-# qs = qs.filter(servico__tipo_servico_id=kwargs['servico'])
-
-# qs = qs.distinct('municipio__uf__nome', 'nome')
-
-# del(kwargs['servico'])
-
-# qs = qs.filter(**kwargs)
-# if 'o' in get:
-# qs = query_ordena(qs, get['o'])
-
-# return qs
-
-
-# def carrinhoOrGet_for_qs(request):
-# """
-# Verifica se existe casas na sessão se não verifica get e retorna qs correspondente.
-# """
-# if 'carrinho_casas' in request.session:
-# ids = request.session['carrinho_casas']
-# qs = Orgao.objects.filter(pk__in=ids)
-# else:
-# qs = Orgao.objects.all()
-# if request.GET:
-# qs = get_for_qs(request.GET, qs)
-# return qs
-
-
-# def adicionar_casas_carrinho(request, queryset=None, id=None):
-# if request.method == 'POST':
-# ids_selecionados = request.POST.getlist('_selected_action')
-# if 'carrinho_casas' not in request.session:
-# request.session['carrinho_casas'] = ids_selecionados
-# else:
-# lista = request.session['carrinho_casas']
-# # Verifica se id já não está adicionado
-# for id in ids_selecionados:
-# if id not in lista:
-# lista.append(id)
-# request.session['carrinho_casas'] = lista
-
-
-# @login_required
-# def visualizar_carrinho(request):
-
-# qs = carrinhoOrGet_for_qs(request)
-
-# paginator = Paginator(qs, 100)
-
-# # Make sure page request is an int. If not, deliver first page.
-# # Esteja certo de que o `page request` é um inteiro. Se não, mostre a primeira página.
-# try:
-# page = int(request.GET.get('page', '1'))
-# except ValueError:
-# page = 1
-
-# # Se o page request (9999) está fora da lista, mostre a última página.
-# try:
-# paginas = paginator.page(page)
-# except (EmptyPage, InvalidPage):
-# paginas = paginator.page(paginator.num_pages)
-
-# carrinhoIsEmpty = not('carrinho_casas' in request.session)
-
-# return render(
-# request,
-# 'casas/carrinho.html',
-# {
-# 'carIsEmpty': carrinhoIsEmpty,
-# 'paginas': paginas,
-# 'query_str': '?' + request.META['QUERY_STRING']
-# }
-# )
-
-
-# @login_required
-# def excluir_carrinho(request):
-# if 'carrinho_casas' in request.session:
-# del request.session['carrinho_casas']
-# messages.info(request, 'O carrinho foi esvaziado')
-# return HttpResponseRedirect('../../')
-
-
-# @login_required
-# def deleta_itens_carrinho(request):
-# if request.method == 'POST':
-# ids_selecionados = request.POST.getlist('_selected_action')
-# if 'carrinho_casas' in request.session:
-# lista = request.session['carrinho_casas']
-# for item in ids_selecionados:
-# lista.remove(item)
-# if lista:
-# request.session['carrinho_casas'] = lista
-# else:
-# del lista
-# del request.session['carrinho_casas']
-
-# return HttpResponseRedirect('.')
-
-
-# # @login_required
-# # def labels_report(request, id=None, tipo=None, formato='3x9_etiqueta'):
-# # """ TODO: adicionar suporte para resultado de pesquisa do admin.
-# # """
-
-# # if request.POST:
-# # if 'tipo_etiqueta' in request.POST:
-# # tipo = request.POST['tipo_etiqueta']
-# # if 'tamanho_etiqueta' in request.POST:
-# # formato = request.POST['tamanho_etiqueta']
-
-# # if tipo == 'sem_presidente':
-# # return labels_report_sem_presidente(request, id, formato)
-
-# # if id:
-# # qs = Orgao.objects.filter(pk=id)
-# # else:
-# # qs = carrinhoOrGet_for_qs(request)
-
-# # if not qs:
-# # return HttpResponseRedirect('../')
-
-# # response = HttpResponse(content_type='application/pdf')
-# # response['Content-Disposition'] = 'attachment; filename=casas.pdf'
-# # report = CasasLegislativasLabels(queryset=qs, formato=formato)
-# # report.generate_by(PDFGenerator, filename=response)
-
-# # return response
-
-
-# # @login_required
-# # def labels_report_parlamentar(request, id=None, formato='3x9_etiqueta'):
-# # """ TODO: adicionar suporte para resultado de pesquisa do admin.
-# # """
-
-# # if request.POST:
-# # if 'tamanho_etiqueta' in request.POST:
-# # formato = request.POST['tamanho_etiqueta']
-
-# # if id:
-# # legislaturas = [c.legislatura_set.latest('data_inicio') for c in Orgao.objects.filter(pk__in=id, legislatura__id__isnull=False).distinct()]
-# # mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas])
-# # parlamentares = [m.parlamentar for m in mandatos]
-# # qs = parlamentares
-
-# # else:
-# # qs = carrinhoOrGet_for_parlamentar_qs(request)
-
-# # if not qs:
-# # return HttpResponseRedirect('../')
-
-# # response = HttpResponse(content_type='application/pdf')
-# # response['Content-Disposition'] = 'attachment; filename=casas.pdf'
-# # report = ParlamentaresLabels(queryset=qs, formato=formato)
-# # report.generate_by(PDFGenerator, filename=response)
-
-# # return response
-
-
-# def carrinhoOrGet_for_parlamentar_qs(request):
-# """
-# Verifica se existe parlamentares na sessão se não verifica get e retorna qs correspondente.
-# """
-# if 'carrinho_casas' in request.session:
-# ids = request.session['carrinho_casas']
-# legislaturas = [c.legislatura_set.latest('data_inicio') for c in Orgao.objects.filter(pk__in=ids, legislatura__id__isnull=False).distinct()]
-# mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas])
-# parlamentares = [m.parlamentar for m in mandatos]
-# qs = parlamentares
-# else:
-# legislaturas = [c.legislatura_set.latest('data_inicio') for c in Orgao.objects.all().distinct()]
-# mandatos = reduce(lambda x, y: x | y, [l.mandato_set.all() for l in legislaturas])
-# parlamentares = [m.parlamentar for m in mandatos]
-# qs = parlamentares
-# if request.GET:
-# qs = get_for_qs(request.GET, qs)
-# return qs
-
-
-# @login_required
-# def labels_report_sem_presidente(request, id=None, formato='2x5_etiqueta'):
-# """ TODO: adicionar suporte para resultado de pesquisa do admin.
-# """
-
-# if id:
-# qs = Orgao.objects.filter(pk=id)
-# else:
-# qs = carrinhoOrGet_for_qs(request)
-
-# if not qs:
-# return HttpResponseRedirect('../')
-
-# response = HttpResponse(content_type='application/pdf')
-# response['Content-Disposition'] = 'attachment; filename=casas.pdf'
-# report = CasasLegislativasLabelsSemPresidente(queryset=qs, formato=formato)
-# report.generate_by(PDFGenerator, filename=response)
-
-# return response
-
-
-# @login_required
-# def report(request, id=None, tipo=None):
-
-# if request.POST:
-# if 'tipo_relatorio' in request.POST:
-# tipo = request.POST['tipo_relatorio']
-
-# if tipo == 'completo':
-# return report_complete(request, id)
-
-# if id:
-# qs = Orgao.objects.filter(pk=id)
-# else:
-# qs = carrinhoOrGet_for_qs(request)
-
-# if not qs:
-# return HttpResponseRedirect('../')
-
-# qs = qs.order_by('municipio__uf', 'nome')
-# context = {'casas': qs, 'title': _("Relação de Casas Legislativas")}
-
-# return render_to_pdf('casas/report_pdf.html', context)
-
-
-# @login_required
-# def report_complete(request, id=None):
-
-# if id:
-# qs = Orgao.objects.filter(pk=id)
-# else:
-# qs = carrinhoOrGet_for_qs(request)
-
-# if not qs:
-# return HttpResponseRedirect('../')
-
-# return render_to_pdf('casas/report_complete_pdf.html', {'casas': qs})
-
-
-# @login_required
-# def casas_sem_convenio_report(request):
-# qs = Orgao.objects.filter(convenio=None).order_by('municipio__uf', 'nome')
-
-# if request.GET:
-# qs = get_for_qs(request.GET, qs)
-# if not qs:
-# return HttpResponseRedirect('../')
-
-# qs = qs.order_by('municipio__uf', 'nome')
-# context = {'casas': qs, 'title': _("Casas sem convênio")}
-
-# return render_to_pdf('casas/report_pdf.html', context)
-
-
-# @login_required
-# def export_csv(request):
-# response = HttpResponse(content_type='text/csv')
-# response['Content-Disposition'] = 'attachment; filename=casas.csv'
-
-# writer = csv.writer(response)
-
-# casas = carrinhoOrGet_for_qs(request)
-# if not casas or not request.POST:
-# return HttpResponseRedirect('../')
-
-# atributos = request.POST.getlist("itens_csv_selected")
-
-# try:
-# atributos.insert(atributos.index(_('Município')), _('UF'))
-# except ValueError:
-# pass
-
-# atributos2 = [s.encode("utf-8") for s in atributos]
-
-# writer.writerow(atributos2)
-
-# for casa in casas:
-# lista = []
-# contatos = casa.funcionario_set.exclude(nome="")
-# for atributo in atributos:
-# if _("CNPJ") == atributo:
-# lista.append(casa.cnpj.encode("utf-8"))
-# elif _("Código IBGE") == atributo:
-# lista.append(str(casa.municipio.codigo_ibge).encode("utf-8"))
-# elif _("Código TSE") == atributo:
-# lista.append(str(casa.municipio.codigo_tse).encode("utf-8"))
-# elif _("Nome") == atributo:
-# lista.append(casa.nome.encode("utf-8"))
-# elif _("Município") == atributo:
-# lista.append(unicode(casa.municipio.uf.sigla).encode("utf-8"))
-# lista.append(unicode(casa.municipio.nome).encode("utf-8"))
-# elif _("Presidente") == atributo:
-# # TODO: Esse encode deu erro em 25/04/2012. Comentei para que o usuário pudesse continuar seu trabalho
-# # É preciso descobrir o porque do erro e fazer a correção definitiva.
-# # lista.append(str(casa.presidente or "").encode("utf-8"))
-# lista.append(str(casa.presidente or ""))
-# elif _("Logradouro") == atributo:
-# lista.append(casa.logradouro.encode("utf-8"))
-# elif _("Bairro") == atributo:
-# lista.append(casa.bairro.encode("utf-8"))
-# elif _("CEP") == atributo:
-# lista.append(casa.cep.encode("utf-8"))
-# elif _("Telefone") == atributo:
-# lista.append(str(casa.telefone or ""))
-# elif _("Página web") == atributo:
-# lista.append(casa.pagina_web.encode("utf-8"))
-# elif _("Email") == atributo:
-# lista.append(casa.email.encode("utf-8"))
-# elif _("Número de parlamentares") == atributo:
-# lista.append(casa.total_parlamentares)
-# elif _("Última alteração de endereco") == atributo:
-# lista.append(casa.ult_alt_endereco)
-# elif _("Servicos SEIT") == atributo:
-# lista.append(", ".join([s.tipo_servico.nome.encode('utf-8')
-# for s in casa.servico_set.filter(
-# data_desativacao__isnull=True)])
-# )
-# elif _("Nome contato") == atributo:
-# if contatos:
-# nomes = ", ".join([c.nome for c in contatos])
-# lista.append(nomes.encode("utf-8"))
-# else:
-# lista.append('')
-# elif _("Cargo contato") == atributo:
-# if contatos:
-# cargos = ", ".join([c.cargo if c.cargo else "?"
-# for c in contatos])
-# lista.append(cargos.encode("utf-8"))
-# else:
-# lista.append('')
-# elif _("Email contato") == atributo:
-# if contatos:
-# emails = ", ".join([c.email if c.email else "?"
-# for c in contatos])
-# lista.append(emails.encode("utf-8"))
-# else:
-# lista.append('')
-# else:
-# pass
-
-# writer.writerow(lista)
-
-# return response
-
-
-# @login_required
-# def portfolio(request):
-# page = request.GET.get('page', 1)
-# tipo = request.GET.get('tipo', None)
-# regiao = request.GET.get('regiao', None)
-# uf_id = request.GET.get('uf', None)
-# meso_id = request.GET.get('meso', None)
-# micro_id = request.GET.get('micro', None)
-
-# data = {}
-# data['errors'] = []
-# data['messages'] = []
-# data['regioes'] = UnidadeFederativa.REGIAO_CHOICES
-# data['tipos_casas'] = TipoOrgao.objects.all()
-# casas = None
-# gerente = None
-
-# if tipo:
-# data['tipo'] = tipo
-
-# if micro_id:
-# microrregiao = get_object_or_404(Microrregiao, pk=micro_id)
-# mesorregiao = microrregiao.mesorregiao
-# uf = mesorregiao.uf
-# data['regiao'] = uf.regiao
-# data['uf_id'] = uf.pk
-# data['meso_id'] = mesorregiao.pk
-# data['micro_id'] = microrregiao.pk
-# data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao)
-# data['mesorregioes'] = uf.mesorregiao_set.all()
-# data['microrregioes'] = mesorregiao.microrregiao_set.all()
-# data['form'] = PortfolioForm(
-# _('Atribuir casas da microrregiao {name} para').format(
-# name=unicode(microrregiao))
-# )
-# data['querystring'] = 'micro={0}'.format(microrregiao.pk)
-# casas = Orgao.objects.filter(
-# municipio__microrregiao=microrregiao
-# )
-# elif meso_id:
-# mesorregiao = get_object_or_404(Mesorregiao, pk=meso_id)
-# uf = mesorregiao.uf
-# data['regiao'] = uf.regiao
-# data['uf_id'] = uf.pk
-# data['meso_id'] = mesorregiao.pk
-# data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao)
-# data['mesorregioes'] = uf.mesorregiao_set.all()
-# data['microrregioes'] = mesorregiao.microrregiao_set.all()
-# data['form'] = PortfolioForm(
-# _('Atribuir casas da mesorregiao {name} para').format(
-# name=unicode(mesorregiao)))
-# data['querystring'] = 'meso={0}'.format(mesorregiao.pk)
-# casas = Orgao.objects.filter(
-# municipio__microrregiao__mesorregiao=mesorregiao
-# )
-# elif uf_id:
-# uf = get_object_or_404(UnidadeFederativa, pk=uf_id)
-# data['regiao'] = uf.regiao
-# data['uf_id'] = uf.pk
-# data['ufs'] = UnidadeFederativa.objects.filter(regiao=uf.regiao)
-# data['mesorregioes'] = uf.mesorregiao_set.all()
-# data['form'] = PortfolioForm(
-# _('Atribuir casas do estado {name} para').format(
-# name=unicode(uf)))
-# data['querystring'] = 'uf={0}'.format(uf.pk)
-# casas = Orgao.objects.filter(municipio__uf=uf)
-# elif regiao:
-# data['regiao'] = regiao
-# data['ufs'] = UnidadeFederativa.objects.filter(regiao=regiao)
-# data['form'] = PortfolioForm(
-# _('Atribuir casas da região {name} para').format(
-# name=[x[1] for x in UnidadeFederativa.REGIAO_CHOICES if
-# x[0] == regiao][0]))
-# data['querystring'] = 'regiao={0}'.format(regiao)
-# casas = Orgao.objects.filter(municipio__uf__regiao=regiao)
-
-# if casas:
-# casas = casas.order_by('municipio__uf',
-# 'municipio__microrregiao__mesorregiao',
-# 'municipio__microrregiao', 'municipio')
-
-# casas.prefetch_related('municipio', 'municipio__uf',
-# 'municipio__microrregiao',
-# 'municipio__microrregiao__mesorregiao',
-# 'gerentes_interlegis')
-
-# if tipo:
-# casas = casas.filter(tipo__sigla=tipo)
-# data['querystring'] += "&tipo={0}".format(tipo)
-
-# if request.method == 'POST':
-# form = PortfolioForm(data=request.POST)
-# if form.is_valid():
-# gerente = form.cleaned_data['gerente']
-# acao = form.cleaned_data['acao']
-
-# count = casas.count()
-
-# if acao == 'ADD':
-# gerente.casas_que_gerencia.add(*casas)
-# data['messages'].append(ungettext(
-# "{count} casa adicionada para {gerente}",
-# "{count} casas adicionadas para {gerente}",
-# count).format(count=count,gerente=gerente.nome_completo)
-# )
-# elif acao == 'DEL':
-# gerente.casas_que_gerencia.remove(*casas)
-# data['messages'].append(ungettext(
-# "{count} casa removida de {gerente}",
-# "{count} casas removidas de {gerente}",
-# count).format(count=count,gerente=gerente.nome_completo)
-# )
-# else:
-# data['errors'].append(_("Ação não definida"))
-# else:
-# data['errors'].append(_("Dados inválidos"))
-
-# paginator = Paginator(casas, 30)
-# try:
-# pagina = paginator.page(page)
-# except (EmptyPage, InvalidPage):
-# pagina = paginator.page(paginator.num_pages)
-# data['page_obj'] = pagina
-
-# return render(request, 'casas/portfolio.html', data)
-
-
def resumo_carteira(casas):
regioes = {r[0]: 0 for r in UnidadeFederativa.REGIAO_CHOICES}
regioes["total"] = 0
@@ -1110,6 +227,7 @@ def casas_carteira(request, casas, context):
@login_required
+@staff_member_required
def painel_relacionamento(request):
page = request.GET.get("page", 1)
snippet = request.GET.get("snippet", "")
@@ -1203,64 +321,125 @@ def painel_relacionamento(request):
return render(request, "casas/painel.html", context)
-# @login_required
-# def gerentes_interlegis(request):
-# formato = request.GET.get('fmt', 'html')
-# inclui_casas = (request.GET.get('casas', 'no') == 'yes')
-# gerentes = Servidor.objects.exclude(
-# casas_que_gerencia=None).select_related('casas_que_gerencia')
-# dados = []
-# for gerente in gerentes:
-# row = {'gerente': gerente, 'ufs': []}
-# for uf in (gerente.casas_que_gerencia.distinct('municipio__uf__sigla')
-# .order_by('municipio__uf__sigla')
-# .values_list('municipio__uf__sigla', 'municipio__uf__nome')
-# ):
-# row['ufs'].append((
-# uf[0],
-# uf[1],
-# gerente.casas_que_gerencia.filter(municipio__uf__sigla=uf[0])
-# ))
-# dados.append(row)
+################################################################################
+# Views para site público - acesso dos contatos Interlegis #
+################################################################################
+
+
+class CasaUpdateView(
+ ContatoInterlegisViewMixin, LoginRequiredMixin, UpdateView
+):
+ model = Orgao
+ fields = [
+ "cnpj",
+ "data_instalacao",
+ "horario_funcionamento",
+ "logradouro",
+ "bairro",
+ "cep",
+ "brasao",
+ "foto",
+ "telefone_geral",
+ "email",
+ "pagina_web",
+ ]
+ template_name = "public/casas/orgao_update.html"
+ success_url = reverse_lazy("home_index")
+
+ def get_object(self, *args, **kwargs):
+ return self.get_casa()
+
+ def get_context_data(self, **kwargs):
+ return super().get_context_data(**kwargs)
+
+
+class FuncionarioListView(
+ ContatoInterlegisViewMixin, LoginRequiredMixin, ListView
+):
+ model = Funcionario
+ paginate_by = 100
+ template_name = "public/casas/funcionario_list.html"
+
+ def get_queryset(self):
+ casa = self.get_casa()
+ if casa:
+ return casa.funcionario_set.exclude(desativado=True)
+ else:
+ return Funcionario.objects.none()
+
+
+class FuncionarioCreateView(
+ ContatoInterlegisViewMixin, LoginRequiredMixin, CreateView
+):
+ model = Funcionario
+ form_class = FuncionarioForm
+ template_name = "public/casas/funcionario_update.html"
+ success_url = reverse_lazy("casas:funcionario_listview")
-# if formato == 'pdf':
-# return render_to_pdf(
-# 'casas/gerentes_interlegis_pdf.html',
-# {'gerentes': dados}
-# )
-# elif formato == 'csv':
-# response = HttpResponse(content_type='text/csv')
-# response['Content-Disposition'] = ('attachment; '
-# 'filename="gerentes_interlegis.csv"')
-# fieldnames = ['gerente', 'total_casas', 'uf', 'total_casas_uf']
-# if inclui_casas:
-# fieldnames.append('casa_legislativa')
-# writer = csv.DictWriter(response, fieldnames=fieldnames)
-# writer.writeheader()
-# for linha in dados:
-# rec = {
-# 'gerente': linha['gerente'].nome_completo.encode('utf8'),
-# 'total_casas': linha['gerente'].casas_que_gerencia.count()
-# }
-# for uf in linha['ufs']:
-# rec['uf'] = uf[1].encode('utf8')
-# rec['total_casas_uf'] = uf[2].count()
-# if inclui_casas:
-# for casa in uf[2]:
-# rec['casa_legislativa'] = casa.nome.encode('utf8')
-# writer.writerow(rec)
-# rec['gerente'] = ''
-# rec['total_casas'] = ''
-# rec['uf'] = ''
-# rec['total_casas_uf'] = ''
-# else:
-# writer.writerow(rec)
-# rec['gerente'] = ''
-# rec['total_casas'] = ''
-# return response
+ def get_queryset(self):
+ return self.get_casa().funcionario_set.all()
-# return render(
-# request,
-# 'casas/gerentes_interlegis.html',
-# {'gerentes': dados}
-# )
+ def form_valid(self, form):
+ casa = self.get_casa()
+ self.object = form.save(commit=False)
+ self.object.casa_legislativa = casa
+ self.object.save()
+ return super().form_valid(form)
+
+
+class FuncionarioUpdateView(
+ ContatoInterlegisViewMixin, LoginRequiredMixin, UpdateView
+):
+ model = Funcionario
+ form_class = FuncionarioForm
+ template_name = "public/casas/funcionario_update.html"
+ success_url = reverse_lazy("casas:funcionario_listview")
+
+ def get_object(self, queryset=None):
+ casa = self.get_casa()
+ return super().get_object(casa.funcionario_set.all())
+
+
+class FuncionarioDeleteView(
+ ContatoInterlegisViewMixin, LoginRequiredMixin, DeleteView
+):
+ model = Funcionario
+ template_name = "public/casas/funcionario_delete.html"
+ success_url = reverse_lazy("casas:funcionario_listview")
+
+ def get_object(self, queryset=None):
+ casa = self.get_casa()
+ return super().get_object(casa.funcionario_set.all())
+
+ def get_context_data(self, **kwargs):
+ func = self.get_object()
+ casa = self.get_casa()
+ User = get_user_model()
+ if (
+ func.setor == "contato_interlegis"
+ and func.nome
+ and func.cpf
+ and func.identidade
+ and User.objects.filter(username=func.email).exists()
+ ):
+ # Este funcionário pode fazer login #
+ excludes = (
+ Q(desativado=True)
+ | Q(id=func.id)
+ | Q(nome="")
+ | Q(cpf="")
+ | Q(identidade="")
+ )
+ emails = [f.email for f in casa.funcionario_set.exclude(excludes)]
+ unico_login = not User.objects.filter(username__in=emails).exists()
+ else:
+ unico_login = False
+ context = super().get_context_data(**kwargs)
+ context["unico_login"] = unico_login
+ return context
+
+ def form_valid(self, form):
+ success_url = self.get_success_url()
+ self.object.desativado = True
+ self.object.save()
+ return HttpResponseRedirect(success_url)
diff --git a/sigi/apps/contatos/admin.py b/sigi/apps/contatos/admin.py
index f9d0649..63ae549 100644
--- a/sigi/apps/contatos/admin.py
+++ b/sigi/apps/contatos/admin.py
@@ -10,6 +10,7 @@ from sigi.apps.contatos.models import (
Telefone,
Contato,
)
+from sigi.apps.parlamentares.models import Senador
from sigi.apps.utils import queryset_ascii
@@ -21,6 +22,11 @@ class MicrorregiaoInline(admin.TabularInline):
model = Microrregiao
+class SenadorInline(admin.StackedInline):
+ model = Senador
+ extra = 0
+
+
@admin.register(UnidadeFederativa)
class UnidadeFederativaAdmin(admin.ModelAdmin):
actions = None
@@ -32,7 +38,7 @@ class UnidadeFederativaAdmin(admin.ModelAdmin):
)
search_fields = ("search_text", "codigo_ibge", "sigla", "regiao")
get_queryset = queryset_ascii
- inlines = (MesorregiaoInline,)
+ inlines = (SenadorInline, MesorregiaoInline)
@admin.register(Mesorregiao)
diff --git a/sigi/apps/convenios/urls.py b/sigi/apps/convenios/urls.py
index 8d7181c..d3155ac 100644
--- a/sigi/apps/convenios/urls.py
+++ b/sigi/apps/convenios/urls.py
@@ -9,14 +9,3 @@ urlpatterns = [
),
path("importar/", views.importar_gescon, name="importar-gescon"),
]
-
-# urlpatterns = patterns(
-# 'sigi.apps.convenios.views',
-
-# url(r'^convenio/reports/$', 'report', name='convenios-report'),
-# url(r'^convenio/carrinho/$', 'visualizar_carrinho', name='visualizar-carrinho'),
-# url(r'^convenio/carrinho/excluir_carrinho/$', 'excluir_carrinho', name='excluir-carrinho'), # tagerror
-# url(r'^convenio/carrinho/deleta_itens_carrinho$', 'deleta_itens_carrinho', name='deleta-itens-carrinho'), # tagerror
-# url(r'^convenio/csv/$', 'export_csv', name='convenios-csv'),
-# url(r'^importar/$', 'importar_gescon', name='importar-gescon'),
-# )
diff --git a/sigi/apps/convenios/views.py b/sigi/apps/convenios/views.py
index 8e10a08..a5ae746 100644
--- a/sigi/apps/convenios/views.py
+++ b/sigi/apps/convenios/views.py
@@ -10,6 +10,7 @@ from django.http.response import HttpResponseForbidden
from django.shortcuts import render, get_list_or_404
from django.template import Context, loader
from django.utils.translation import gettext as _
+from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth.decorators import login_required
from django_weasyprint.views import WeasyTemplateResponse
from sigi.apps.casas.models import Orgao
@@ -25,6 +26,7 @@ from sigi.apps.convenios.models import Convenio, Gescon, Projeto
@login_required
+@staff_member_required
def report_regiao(request, regiao):
REGIAO_CHOICES = dict(UnidadeFederativa.REGIAO_CHOICES)
projetos = Projeto.objects.all()
@@ -135,19 +137,18 @@ def casas_estado_to_tabela(casas, convenios, regiao):
@login_required
+@staff_member_required
def importar_gescon(request):
if not request.user.is_superuser:
return HttpResponseForbidden()
- context = admin.site.each_context(request)
-
action = request.GET.get("action", "")
gescon = Gescon.load()
if action == "importar":
gescon.importa_contratos()
- context["gescon"] = gescon
+ context = {"gescon": gescon}
return render(request, "convenios/importar_gescon.html", context)
diff --git a/sigi/apps/eventos/admin.py b/sigi/apps/eventos/admin.py
index 745bce9..9352e24 100644
--- a/sigi/apps/eventos/admin.py
+++ b/sigi/apps/eventos/admin.py
@@ -3,6 +3,7 @@ from django.contrib import admin
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import path
+from django.utils.safestring import mark_safe
from django.utils.translation import gettext as _
from django_weasyprint.views import WeasyTemplateResponse
from import_export.fields import Field
@@ -118,8 +119,10 @@ class CronogramaInline(admin.StackedInline):
@admin.register(TipoEvento)
-class TipoEventAdmin(admin.ModelAdmin):
- search_fields = ("nome",)
+class TipoEventoAdmin(admin.ModelAdmin):
+ list_display = ["nome", "categoria"]
+ list_filter = ["categoria", "casa_solicita"]
+ search_fields = ["nome"]
inlines = [ChecklistInline]
@@ -147,9 +150,12 @@ class EventoAdmin(CartExportMixin, admin.ModelAdmin):
resource_class = EventoResource
date_hierarchy = "data_inicio"
list_display = (
+ "get_banner",
"nome",
"tipo_evento",
+ "turma",
"status",
+ "publicar",
"link_sigad",
"data_inicio",
"data_termino",
@@ -157,8 +163,10 @@ class EventoAdmin(CartExportMixin, admin.ModelAdmin):
"solicitante",
"total_participantes",
)
+ list_display_links = ["get_banner", "nome"]
list_filter = (
"status",
+ "publicar",
("num_processo", EmptyFilter),
"tipo_evento",
"tipo_evento__categoria",
@@ -186,13 +194,20 @@ class EventoAdmin(CartExportMixin, admin.ModelAdmin):
)
save_as = True
+ @admin.display(description=_("número do processo SIGAD"))
def link_sigad(self, obj):
if obj.pk is None:
return ""
- return obj.get_sigad_url()
-
- link_sigad.short_description = _("número do processo SIGAD")
- link_sigad.allow_tags = True
+ return mark_safe(obj.get_sigad_url())
+
+ @admin.display(description=_("banner"))
+ def get_banner(self, obj):
+ if obj.banner:
+ return mark_safe(
+ f''
+ )
+ else:
+ return ""
def lookup_allowed(self, lookup, value):
return super(EventoAdmin, self).lookup_allowed(
diff --git a/sigi/apps/eventos/admin_urls.py b/sigi/apps/eventos/admin_urls.py
new file mode 100644
index 0000000..9255f11
--- /dev/null
+++ b/sigi/apps/eventos/admin_urls.py
@@ -0,0 +1,14 @@
+from django.urls import path, include
+from sigi.apps.eventos import views
+
+urlpatterns = [
+ path("calendario/", views.calendario, name="eventos_calendario"),
+ path(
+ "alocacaoequipe/", views.alocacao_equipe, name="eventos_alocacaoequipe"
+ ),
+ path(
+ "evento//declaracao/",
+ views.declaracao,
+ name="evento-declaracao",
+ ),
+]
diff --git a/sigi/apps/eventos/forms.py b/sigi/apps/eventos/forms.py
index fe2cc50..6c53494 100644
--- a/sigi/apps/eventos/forms.py
+++ b/sigi/apps/eventos/forms.py
@@ -12,11 +12,13 @@ class EventoAdminForm(forms.ModelForm):
fields = (
"tipo_evento",
"nome",
+ "turma",
"descricao",
"virtual",
"solicitante",
"num_processo",
"data_pedido",
+ "solicitacao",
"data_inicio",
"data_termino",
"carga_horaria",
@@ -27,6 +29,11 @@ class EventoAdminForm(forms.ModelForm):
"publico_alvo",
"total_participantes",
"status",
+ "publicar",
+ "link_inscricao",
+ "contato",
+ "telefone",
+ "banner",
"data_cancelamento",
"motivo_cancelamento",
)
diff --git a/sigi/apps/eventos/migrations/0024_evento_banner_evento_contato_evento_link_inscricao_and_more.py b/sigi/apps/eventos/migrations/0024_evento_banner_evento_contato_evento_link_inscricao_and_more.py
new file mode 100644
index 0000000..5df42c0
--- /dev/null
+++ b/sigi/apps/eventos/migrations/0024_evento_banner_evento_contato_evento_link_inscricao_and_more.py
@@ -0,0 +1,38 @@
+# Generated by Django 4.0.6 on 2022-07-19 02:08
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('eventos', '0023_cronograma_checklist'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='evento',
+ name='banner',
+ field=models.ImageField(blank=True, null=True, upload_to='', verbose_name='banner do evento'),
+ ),
+ migrations.AddField(
+ model_name='evento',
+ name='contato',
+ field=models.CharField(blank=True, max_length=100, verbose_name='contato'),
+ ),
+ migrations.AddField(
+ model_name='evento',
+ name='link_inscricao',
+ field=models.URLField(blank=True, verbose_name='link de inscrição'),
+ ),
+ migrations.AddField(
+ model_name='evento',
+ name='publicar',
+ field=models.BooleanField(default=False, verbose_name='publicar no site'),
+ ),
+ migrations.AddField(
+ model_name='evento',
+ name='telefone',
+ field=models.CharField(blank=True, max_length=30, verbose_name='tefone de contato'),
+ ),
+ ]
diff --git a/sigi/apps/eventos/migrations/0025_evento_turma.py b/sigi/apps/eventos/migrations/0025_evento_turma.py
new file mode 100644
index 0000000..a97c3a7
--- /dev/null
+++ b/sigi/apps/eventos/migrations/0025_evento_turma.py
@@ -0,0 +1,18 @@
+# Generated by Django 4.1 on 2022-08-08 22:45
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("eventos", "0024_evento_banner_evento_contato_evento_link_inscricao_and_more"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="evento",
+ name="turma",
+ field=models.CharField(blank=True, max_length=100, verbose_name="turma"),
+ ),
+ ]
diff --git a/sigi/apps/eventos/migrations/0026_preenche_turma.py b/sigi/apps/eventos/migrations/0026_preenche_turma.py
new file mode 100644
index 0000000..422af5e
--- /dev/null
+++ b/sigi/apps/eventos/migrations/0026_preenche_turma.py
@@ -0,0 +1,31 @@
+# Generated by Django 4.1 on 2022-08-08 22:46
+
+from django.db import migrations
+
+
+def separa_turma(apps, schema_editor):
+ Evento = apps.get_model("eventos", "Evento")
+ for evento in Evento.objects.filter(nome__icontains="Turma"):
+ split_name = evento.nome.rsplit("-", 1)
+ if len(split_name) == 2:
+ evento.nome = split_name[0].strip()
+ evento.turma = split_name[1].strip()
+ evento.save()
+
+
+def junta_turma(apps, schema_editor):
+ Evento = apps.get_model("eventos", "Evento")
+ for evento in Evento.objects.exclude(turma=""):
+ evento.nome = evento.nome + " - " + evento.turma
+ evento.save()
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("eventos", "0025_evento_turma"),
+ ]
+
+ operations = [
+ migrations.RunPython(separa_turma, junta_turma),
+ ]
diff --git a/sigi/apps/eventos/migrations/0027_tipoevento_casa_solicita.py b/sigi/apps/eventos/migrations/0027_tipoevento_casa_solicita.py
new file mode 100644
index 0000000..4215a9f
--- /dev/null
+++ b/sigi/apps/eventos/migrations/0027_tipoevento_casa_solicita.py
@@ -0,0 +1,20 @@
+# Generated by Django 4.1 on 2022-08-08 22:50
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("eventos", "0026_preenche_turma"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="tipoevento",
+ name="casa_solicita",
+ field=models.BooleanField(
+ default=False, verbose_name="casa pode solicitar"
+ ),
+ ),
+ ]
diff --git a/sigi/apps/eventos/migrations/0028_evento_solicitacao.py b/sigi/apps/eventos/migrations/0028_evento_solicitacao.py
new file mode 100644
index 0000000..2dfc513
--- /dev/null
+++ b/sigi/apps/eventos/migrations/0028_evento_solicitacao.py
@@ -0,0 +1,26 @@
+# Generated by Django 4.1 on 2022-08-28 15:56
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("ocorrencias", "0011_alter_categoria_tipo"),
+ ("eventos", "0027_tipoevento_casa_solicita"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="evento",
+ name="solicitacao",
+ field=models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.SET_NULL,
+ to="ocorrencias.ocorrencia",
+ verbose_name="Solicitação de origem",
+ ),
+ ),
+ ]
diff --git a/sigi/apps/eventos/models.py b/sigi/apps/eventos/models.py
index 20ab049..2bc557a 100644
--- a/sigi/apps/eventos/models.py
+++ b/sigi/apps/eventos/models.py
@@ -31,6 +31,7 @@ class TipoEvento(models.Model):
categoria = models.CharField(
_("Categoaria"), max_length=1, choices=CATEGORIA_CHOICES
)
+ casa_solicita = models.BooleanField(_("casa pode solicitar"), default=False)
class Meta:
ordering = ("nome",)
@@ -68,6 +69,7 @@ class Evento(models.Model):
on_delete=models.PROTECT,
)
nome = models.CharField(_("Nome do evento"), max_length=100)
+ turma = models.CharField(_("turma"), max_length=100, blank=True)
descricao = models.TextField(_("Descrição do evento"))
virtual = models.BooleanField(_("Virtual"), default=False)
solicitante = models.CharField(_("Solicitante"), max_length=100)
@@ -83,6 +85,13 @@ class Evento(models.Model):
blank=True,
help_text=_("Data em que o pedido do Gabinete chegou à COPERI"),
)
+ solicitacao = models.ForeignKey(
+ "ocorrencias.Ocorrencia",
+ blank=True,
+ null=True,
+ verbose_name=_("Solicitação de origem"),
+ on_delete=models.SET_NULL,
+ )
data_inicio = models.DateTimeField(
_("Data/hora do Início"), null=True, blank=True
)
@@ -111,6 +120,13 @@ class Evento(models.Model):
),
)
status = models.CharField(_("Status"), max_length=1, choices=STATUS_CHOICES)
+ publicar = models.BooleanField(_("publicar no site"), default=False)
+ link_inscricao = models.URLField(_("link de inscrição"), blank=True)
+ contato = models.CharField(_("contato"), max_length=100, blank=True)
+ telefone = models.CharField(
+ _("tefone de contato"), max_length=30, blank=True
+ )
+ banner = models.ImageField(_("banner do evento"), blank=True, null=True)
data_cancelamento = models.DateField(
_("Data de cancelamento"), blank=True, null=True
)
@@ -156,10 +172,17 @@ class Evento(models.Model):
raise ValidationError(
_("Data de término deve ser posterior à data de início")
)
+
+ super().save(*args, **kwargs)
+ save_again = False
+
total = self.convite_set.aggregate(total=Sum("qtde_participantes"))
total = total["total"]
+
if total and total > 0:
self.total_participantes = total
+ super().save(*args, **kwargs)
+
if self.status in [
Evento.STATUS_PLANEJAMENTO,
Evento.STATUS_AGUARDANDOSIGAD,
@@ -194,7 +217,6 @@ class Evento(models.Model):
self.calcula_datas(cronograma_list)
for item in cronograma_list:
item.save()
- super().save(*args, **kwargs)
def calcula_datas(self, cronograma_list):
def ajusta_data(elemento, data_termino):
diff --git a/sigi/apps/eventos/templates/eventos/convida_casa.html b/sigi/apps/eventos/templates/eventos/convida_casa.html
index 08780f9..858c5f5 100644
--- a/sigi/apps/eventos/templates/eventos/convida_casa.html
+++ b/sigi/apps/eventos/templates/eventos/convida_casa.html
@@ -125,7 +125,7 @@
$(`#id_contato-${campos[x][1]}`).val($(`#id_presidente-${campos[x][0]}`).val());
}
});
- $.ajax("{% url 'parlamentar-json' casa.id %}", {
+ $.ajax("{% url 'parlamentares:parlamentar_json' casa.id %}", {
dataType: 'json',
success: function(data) {
function complete(nome) {
diff --git a/sigi/apps/eventos/templates/eventos/lista.html b/sigi/apps/eventos/templates/eventos/lista.html
new file mode 100644
index 0000000..e95d402
--- /dev/null
+++ b/sigi/apps/eventos/templates/eventos/lista.html
@@ -0,0 +1,21 @@
+{% load i18n %}
+
+ {% for evento in object_list %}
+
+
+
{{ evento.data_inicio|date:"SHORT_DATE_FORMAT" }}
+
+
+
{{ evento.data_inicio|date:"G\hi" }}
+
+
+
+
{{ evento.nome }}
+
{% blocktrans with local=evento.local %}Local: {{ local }}{% endblocktrans %}
+
+
+
+ {% empty %}
+
{% trans 'No events yet.' %}
+ {% endfor %}
+
\ No newline at end of file
diff --git a/sigi/apps/eventos/urls.py b/sigi/apps/eventos/urls.py
index debf6a4..aaf5ca4 100644
--- a/sigi/apps/eventos/urls.py
+++ b/sigi/apps/eventos/urls.py
@@ -1,47 +1,4 @@
from django.urls import path, include
from sigi.apps.eventos import views
-urlpatterns = [
- path("calendario/", views.calendario, name="eventos-calendario"),
- path(
- "alocacaoequipe/", views.alocacao_equipe, name="eventos-alocacao-equipe"
- ),
- path("evento//", views.evento, name="eventos-evento"),
- path(
- "evento//convite//",
- views.convida_casa,
- name="eventos-evento-convida",
- ),
- path(
- "evento//declaracao/",
- views.declaracao,
- name="evento-declaracao",
- ),
- path(
- "evento/presidente//",
- views.presidente_form,
- name="presidente-form-snippet",
- ),
-]
-
-# from django.conf.urls import patterns, url
-
-
-# urlpatterns = patterns(
-# 'sigi.apps.eventos.views',
-# # Painel de ocorrencias
-# url(r'^calendario/$', 'calendario', name='eventos-calendario'),
-# url(r'^alocacaoequipe/$', 'alocacao_equipe', name='eventos-alocacaoequipe'),
-# # Carrinho
-# url(r'^evento/carrinho/$', 'visualizar_carrinho',
-# name='visualizar-carrinho-evento'),
-# url(r'^evento/carrinho/excluir_carrinho/$', 'excluir_carrinho',
-# name='excluir-carrinho-evento'), # Error
-# url(r'^evento/carrinho/deleta_itens_carrinho$', 'deleta_itens_carrinho',
-# name='deleta-itens-carrinho-evento'), # Error
-# url(r'^evento/csv/$', 'export_csv', name='evento-export-csv'), # Error
-# url(r'^evento/(?P\w+)/declaracao/$', 'declaracao',
-# name='evento-declaracao'),
-
-
-# )
+urlpatterns = []
diff --git a/sigi/apps/eventos/views.py b/sigi/apps/eventos/views.py
index 90f8eab..c73923f 100644
--- a/sigi/apps/eventos/views.py
+++ b/sigi/apps/eventos/views.py
@@ -5,8 +5,9 @@ from functools import reduce
from typing import OrderedDict
from django import forms
from django.contrib import messages
-from django.contrib.admin.sites import site
+from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth.decorators import login_required
+from django.core.paginator import Paginator
from django.http import HttpResponse
from django.shortcuts import redirect, render, get_object_or_404
from django.template import Template, Context
@@ -19,6 +20,8 @@ from django.utils.translation import (
gettext as _,
)
from django.urls import reverse
+from django.views.decorators.clickjacking import xframe_options_exempt
+from django.views.generic import ListView
from django_weasyprint.utils import django_url_fetcher
from django_weasyprint.views import WeasyTemplateResponse
from weasyprint import HTML
@@ -37,6 +40,7 @@ from sigi.apps.servidores.models import Servidor
@login_required
+@staff_member_required
def calendario(request):
mes_pesquisa = int(request.GET.get("mes", timezone.localdate().month))
ano_pesquisa = int(request.GET.get("ano", timezone.localdate().year))
@@ -62,7 +66,7 @@ def calendario(request):
data_inicio__year=ano_pesquisa, data_inicio__month=mes_pesquisa
)
- context = site.each_context(request) or {}
+ context = {}
if formato == "cal" or pdf:
semanas = calendar.Calendar().monthdatescalendar(
@@ -111,6 +115,7 @@ def calendario(request):
@login_required
+@staff_member_required
def declaracao(request, id):
if request.method == "POST":
form = SelecionaModeloForm(request.POST)
@@ -162,206 +167,33 @@ def declaracao(request, id):
else:
form = SelecionaModeloForm()
- context = site.each_context(request)
- context["form"] = form
- context["evento_id"] = id
-
+ context = {"form": form, "evento_id": id}
return render(request, "eventos/seleciona_modelo.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(reverse("eventos-evento", args=[evento_id]))
-
- evento = get_object_or_404(Evento, id=evento_id)
- casa = get_object_or_404(Orgao, id=casa_id)
-
- projetos = Projeto.objects.exclude(modelo_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=timezone.localdate(),
- )
-
- contato = casa.contato_interlegis or Funcionario(
- casa_legislativa=casa, setor="contato_interlegis"
- )
- presidente = casa.presidente
- parlamentares = casa.parlamentar_set.all()
-
- if request.method == "POST":
- id_presidente = request.POST.get("id_presidente", None)
-
- if id_presidente is None:
- messages.error(request, _("Presidente não foi identificado"))
- return redirect(".")
- presidente = get_object_or_404(Parlamentar, id=id_presidente)
-
- form_convite = ConviteForm(request.POST, instance=convite)
- form_casa = CasaForm(request.POST, request.FILES, instance=casa)
- form_presidente = ParlamentarForm(
- 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(commit=False)
- contato.setor = "contato_interlegis"
- contato.save()
- presidente = form_presidente.save(commit=False)
- presidente.status_mandato = "E"
- presidente.presidente = True
- presidente.save()
- casa = form_casa.save()
- convite = form_convite.save()
-
- proj_id = request.POST.get("save", "")
-
- if proj_id:
- convite.anexo_set.all().delete()
- query_str = ""
- projeto = get_object_or_404(Projeto, id=proj_id)
- if projeto.texto_oficio:
- oficio = Anexo(
- evento=evento,
- descricao=f"Ofício de solicitação de {projeto.sigla}",
- )
- sigla_casa = casa.sigla or "".join(
- [
- w[0].upper()
- for w in casa.nome.replace("de", "").split()
- ]
- )
- oficio.arquivo.name = (
- f"{Anexo.arquivo.field.upload_to}/"
- f"oficio_{projeto.sigla}_{sigla_casa}.pdf"
- )
- projeto.gerar_oficio(
- oficio.arquivo,
- casa,
- presidente,
- contato,
- request.build_absolute_uri("/"),
- )
- oficio.save()
- query_str += f"anexo_id={oficio.id}&"
- if projeto.modelo_minuta:
- nome = f"Minuta de {projeto.sigla} da {casa.nome}"[:70]
- minuta = Anexo(descricao=nome, evento=evento)
- minuta.arquivo.name = (
- f"{Anexo.arquivo.field.upload_to}/"
- f"minuta_{projeto.sigla}_{sigla_casa}.docx"
- )
- projeto.gerar_minuta(
- minuta.arquivo.path, casa, presidente, contato
- )
- 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(request, _("Preencha corretamente o convite"))
- else:
- form_convite = ConviteForm(instance=convite)
- form_casa = CasaForm(instance=casa)
- form_contato = FuncionarioForm(instance=contato, prefix="contato")
- if presidente:
- form_presidente = ParlamentarForm(
- instance=presidente, prefix="presidente"
- )
- else:
- form_presidente = ""
-
- context = site.each_context(request) or {}
- context.update(
- {
- "form_convite": form_convite,
- "form_casa": form_casa,
- "form_contato": form_contato,
- "form_presidente": form_presidente,
- "evento": evento,
- "convite": convite,
- "casa": casa,
- "presidente": presidente,
- "contato": contato,
- "projetos": projetos,
- "parlamentares": parlamentares,
- }
- )
+class eventoListView(ListView):
+ model = Evento
+ paginate_by = 100
+ template_name = "eventos/lista.html"
- return render(request, "eventos/convida_casa.html", context)
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context.update({"embed": bool(self.request.GET.get("embed", False))})
+ return context
+ def get_queryset(self):
+ queryset = super().get_queryset()
+ return queryset.filter(
+ status=Evento.STATUS_CONFIRMADO, publicar=True
+ ).order_by("data_inicio")
-@login_required
-def presidente_form(request, presidente_id):
- presidente = get_object_or_404(Parlamentar, pk=presidente_id)
- form = ParlamentarForm(instance=presidente, prefix="presidente")
- return render(
- request,
- "eventos/snippets/form_presidente_snippet.html",
- {
- "form_presidente": form,
- "presidente": presidente,
- },
- )
+ @xframe_options_exempt
+ def get(self, request, *args, **kwargs):
+ return super().get(request, *args, **kwargs)
@login_required
+@staff_member_required
def alocacao_equipe(request):
ano_pesquisa = int(request.GET.get("ano", timezone.localdate().year))
mes_pesquisa = int(request.GET.get("mes", 0))
@@ -489,17 +321,15 @@ def alocacao_equipe(request):
]
)
- context = site.each_context(request) or {}
- context.update(
- {
- "anos": Evento.objects.exclude(data_inicio=None)
- .order_by("data_inicio__year")
- .distinct("data_inicio__year")
- .values_list("data_inicio__year", flat=True),
- "ano_pesquisa": ano_pesquisa,
- "linhas": linhas,
- }
- )
+ context = {
+ "anos": Evento.objects.exclude(data_inicio=None)
+ .order_by("data_inicio__year")
+ .distinct("data_inicio__year")
+ .values_list("data_inicio__year", flat=True),
+ "ano_pesquisa": ano_pesquisa,
+ "linhas": linhas,
+ }
+
if mes_pesquisa > 0:
context["mes_pesquisa"] = mes_pesquisa
context["meses"] = meses
diff --git a/sigi/apps/home/accounts_urls.py b/sigi/apps/home/accounts_urls.py
new file mode 100644
index 0000000..d52cff1
--- /dev/null
+++ b/sigi/apps/home/accounts_urls.py
@@ -0,0 +1,37 @@
+from django.urls import path
+from sigi.apps.home import views
+
+urlpatterns = [
+ path("login/", views.LoginView.as_view(), name="login"),
+ path("logout/", views.LogoutView.as_view(), name="logout"),
+ path(
+ "password_change/",
+ views.PasswordChangeView.as_view(),
+ name="password_change",
+ ),
+ path(
+ "password_change/done/",
+ views.PasswordChangeDoneView.as_view(),
+ name="password_change_done",
+ ),
+ path(
+ "password_reset/",
+ views.PasswordResetView.as_view(),
+ name="password_reset",
+ ),
+ path(
+ "password_reset/done/",
+ views.PasswordResetDoneView.as_view(),
+ name="password_reset_done",
+ ),
+ path(
+ "reset///",
+ views.PasswordResetConfirmView.as_view(),
+ name="password_reset_confirm",
+ ),
+ path(
+ "reset/done/",
+ views.PasswordResetCompleteView.as_view(),
+ name="password_reset_complete",
+ ),
+]
diff --git a/sigi/apps/home/fixtures/cards.json b/sigi/apps/home/fixtures/cards.json
index e91c08e..67ca80c 100644
--- a/sigi/apps/home/fixtures/cards.json
+++ b/sigi/apps/home/fixtures/cards.json
@@ -1 +1 @@
-[{"model": "home.cards", "pk": 1, "fields": {"codigo": "resumoseit", "tipo": "T", "nome_url": "home_resumoseit", "query_string": "", "link_acao": false, "titulo": "Serviços hospedados no Interlegis (SEIT)", "descricao": "Tabela com os serviços criados no SEIT por mês", "categoria": "Serviços", "ordem": 1, "default": true}}, {"model": "home.cards", "pk": 2, "fields": {"codigo": "chartseit", "tipo": "C", "nome_url": "home_chartseit", "query_string": "", "link_acao": true, "titulo": "Sazonalidade da hospedagem de serviços", "descricao": "Gráfico com a sazonalidade das solicitações de serviços", "categoria": "Serviços", "ordem": 2, "default": true}}, {"model": "home.cards", "pk": 3, "fields": {"codigo": "carteira", "tipo": "T", "nome_url": "casas-carteira", "query_string": "snippet=resumo&s=sim", "link_acao": false, "titulo": "Resumo da carteira de relacionamentos", "descricao": "Tabela resumindo a carteira de gerência Interlegis", "categoria": "Gerente", "ordem": 1, "default": true}}, {"model": "home.cards", "pk": 4, "fields": {"codigo": "performance", "tipo": "C", "nome_url": "home_chartperformance", "query_string": "", "link_acao": true, "titulo": "Performance da gerência de carteiras", "descricao": "Performance da gerência de carteiras", "categoria": "Gerente", "ordem": 2, "default": true}}, {"model": "home.cards", "pk": 5, "fields": {"codigo": "chartcarteira", "tipo": "C", "nome_url": "home_chartcarteira", "query_string": "", "link_acao": false, "titulo": "Distribuição de Casas por Gerente", "descricao": "Distribuição de Casas por Gerente", "categoria": "Gerente", "ordem": 3, "default": true}}, {"model": "home.cards", "pk": 6, "fields": {"codigo": "resumoconvenios", "tipo": "T", "nome_url": "home_resumoconvenios", "query_string": "", "link_acao": false, "titulo": "Resumo de informações", "descricao": "Resumo de informações", "categoria": "Geral", "ordem": 1, "default": true}}, {"model": "home.cards", "pk": 7, "fields": {"codigo": "chartusoservico", "tipo": "C", "nome_url": "home_chartusoservico", "query_string": "", "link_acao": true, "titulo": "Uso dos serviços SEIT", "descricao": "Mostra como serviços SEIT estão sendo usados pelas Casas", "categoria": "Serviços", "ordem": 3, "default": true}}, {"model": "home.cards", "pk": 8, "fields": {"codigo": "chartatualizacao", "tipo": "C", "nome_url": "home_chartatualizacao", "query_string": "", "link_acao": false, "titulo": "Frequência de atualização", "descricao": "Mostra a frequência com que os portais são atualizados pelas Casas", "categoria": "Serviços", "ordem": 4, "default": true}}, {"model": "home.cards", "pk": 9, "fields": {"codigo": "eventosstatus", "tipo": "C", "nome_url": "eventos_status", "query_string": "", "link_acao": false, "titulo": "Eventos por status", "descricao": "Eventos por status", "categoria": "Eventos", "ordem": 1, "default": true}}, {"model": "home.cards", "pk": 10, "fields": {"codigo": "eventoscategoria", "tipo": "C", "nome_url": "eventos_categoria", "query_string": "", "link_acao": false, "titulo": "Eventos realizados por categoria", "descricao": "Eventos por categoria", "categoria": "Eventos", "ordem": 2, "default": true}}, {"model": "home.cards", "pk": 11, "fields": {"codigo": "eventosano", "tipo": "C", "nome_url": "eventos_ano", "query_string": "", "link_acao": true, "titulo": "Eventos dos últimos 12 meses", "descricao": "Eventos dos últimos 12 meses", "categoria": "Eventos", "ordem": 3, "default": true}}]
\ No newline at end of file
+[{"model": "home.cards", "pk": 1, "fields": {"codigo": "resumoseit", "tipo": "T", "nome_url": "home_resumoseit", "query_string": "", "link_acao": false, "titulo": "Serviços hospedados no Interlegis (SEIT)", "descricao": "Tabela com os serviços criados no SEIT por mês", "categoria": "Serviços", "ordem": 1, "default": true}}, {"model": "home.cards", "pk": 2, "fields": {"codigo": "chartseit", "tipo": "C", "nome_url": "home_chartseit", "query_string": "", "link_acao": true, "titulo": "Sazonalidade da hospedagem de serviços", "descricao": "Gráfico com a sazonalidade das solicitações de serviços", "categoria": "Serviços", "ordem": 2, "default": true}}, {"model": "home.cards", "pk": 3, "fields": {"codigo": "carteira", "tipo": "T", "nome_url": "casas_carteira", "query_string": "snippet=resumo&s=sim", "link_acao": false, "titulo": "Resumo da carteira de relacionamentos", "descricao": "Tabela resumindo a carteira de gerência Interlegis", "categoria": "Gerente", "ordem": 1, "default": true}}, {"model": "home.cards", "pk": 4, "fields": {"codigo": "performance", "tipo": "C", "nome_url": "home_chartperformance", "query_string": "", "link_acao": true, "titulo": "Performance da gerência de carteiras", "descricao": "Performance da gerência de carteiras", "categoria": "Gerente", "ordem": 2, "default": true}}, {"model": "home.cards", "pk": 5, "fields": {"codigo": "chartcarteira", "tipo": "C", "nome_url": "home_chartcarteira", "query_string": "", "link_acao": false, "titulo": "Distribuição de Casas por Gerente", "descricao": "Distribuição de Casas por Gerente", "categoria": "Gerente", "ordem": 3, "default": true}}, {"model": "home.cards", "pk": 6, "fields": {"codigo": "resumoconvenios", "tipo": "T", "nome_url": "home_resumoconvenios", "query_string": "", "link_acao": false, "titulo": "Resumo de informações", "descricao": "Resumo de informações", "categoria": "Geral", "ordem": 1, "default": true}}, {"model": "home.cards", "pk": 7, "fields": {"codigo": "chartusoservico", "tipo": "C", "nome_url": "home_chartusoservico", "query_string": "", "link_acao": true, "titulo": "Uso dos serviços SEIT", "descricao": "Mostra como serviços SEIT estão sendo usados pelas Casas", "categoria": "Serviços", "ordem": 3, "default": true}}, {"model": "home.cards", "pk": 8, "fields": {"codigo": "chartatualizacao", "tipo": "C", "nome_url": "home_chartatualizacao", "query_string": "", "link_acao": false, "titulo": "Frequência de atualização", "descricao": "Mostra a frequência com que os portais são atualizados pelas Casas", "categoria": "Serviços", "ordem": 4, "default": true}}, {"model": "home.cards", "pk": 9, "fields": {"codigo": "eventosstatus", "tipo": "C", "nome_url": "eventos_status", "query_string": "", "link_acao": false, "titulo": "Eventos por status", "descricao": "Eventos por status", "categoria": "Eventos", "ordem": 1, "default": true}}, {"model": "home.cards", "pk": 10, "fields": {"codigo": "eventoscategoria", "tipo": "C", "nome_url": "eventos_categoria", "query_string": "", "link_acao": false, "titulo": "Eventos realizados por categoria", "descricao": "Eventos por categoria", "categoria": "Eventos", "ordem": 2, "default": true}}, {"model": "home.cards", "pk": 11, "fields": {"codigo": "eventosano", "tipo": "C", "nome_url": "eventos_ano", "query_string": "", "link_acao": true, "titulo": "Eventos dos últimos 12 meses", "descricao": "Eventos dos últimos 12 meses", "categoria": "Eventos", "ordem": 3, "default": true}}]
\ No newline at end of file
diff --git a/sigi/apps/home/forms.py b/sigi/apps/home/forms.py
new file mode 100644
index 0000000..8ba462d
--- /dev/null
+++ b/sigi/apps/home/forms.py
@@ -0,0 +1,6 @@
+from django import forms
+from django.utils.translation import gettext as _
+from localflavor.br.forms import BRCNPJField, BRCPFField, BRZipCodeField
+from material.admin.widgets import MaterialAdminTextareaWidget
+from sigi.apps.casas.models import Funcionario, Orgao
+from sigi.apps.parlamentares.models import Parlamentar
diff --git a/sigi/apps/home/mixins.py b/sigi/apps/home/mixins.py
new file mode 100644
index 0000000..418e595
--- /dev/null
+++ b/sigi/apps/home/mixins.py
@@ -0,0 +1,35 @@
+from django.shortcuts import get_object_or_404
+from sigi.apps.casas.models import Orgao
+
+
+class ContatoInterlegisViewMixin:
+ def get_casa(self):
+ user = self.request.user
+ if "casa_id" in self.request.session:
+ casa_id = int(self.request.session["casa_id"])
+ casa = Orgao.objects.filter(id=casa_id).first()
+ elif "casa_id" in self.request.GET:
+ casa_id = int(self.request.GET["casa_id"])
+ casa = Orgao.objects.filter(id=casa_id).first()
+ elif user.is_anonymous and hasattr(
+ self.get_object(), "casa_legislativa"
+ ):
+ casa = self.get_object().casa_legislativa
+ else:
+ casa = Orgao.objects.filter(funcionario__email=user.email).first()
+ if casa:
+ self.request.session["casa_id"] = casa.id
+ return casa
+
+ def get_contato(self):
+ if self.request.user.is_anonymous:
+ return self.get_casa().contato_interlegis
+
+ return self.get_casa().funcionario_set.get(
+ email=self.request.user.email
+ )
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context["casa"] = self.get_casa()
+ return context
diff --git a/sigi/apps/home/templates/home/dashboard/card.html b/sigi/apps/home/templates/home/dashboard/card.html
index 699554a..49c0465 100644
--- a/sigi/apps/home/templates/home/dashboard/card.html
+++ b/sigi/apps/home/templates/home/dashboard/card.html
@@ -34,7 +34,16 @@
- {% include 'sigi/snippets/dashboard.html' %}
+
+
+ {% url card.nome_url as source_url %}
+ {% if card.tipo == 'C' %}
+ {% include "sigi/snippets/base_card_chart.html" with card_title=card.titulo data_source=source_url|add:"?"|add:card.query_string chart_name=card.codigo has_action_links=card.link_acao %}
+ {% else %}
+ {% include "sigi/snippets/base_card_text.html" with card_title=card.titulo data_source=source_url|add:"?"|add:card.query_string card_name=card.codigo %}
+ {% endif %}
+
+