mirror of https://github.com/interlegis/sigi.git
Sesostris Vieira
4 years ago
63 changed files with 639 additions and 14765 deletions
@ -1,26 +0,0 @@ |
|||||
# -*- mode: ruby -*- |
|
||||
# vi: set ft=ruby : |
|
||||
|
|
||||
VAGRANTFILE_API_VERSION = "2" |
|
||||
|
|
||||
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| |
|
||||
|
|
||||
config.vm.box = "ubuntu/trusty64" |
|
||||
|
|
||||
config.vm.network :forwarded_port, guest: 80, host: 8080 |
|
||||
|
|
||||
config.vm.provision :shell, :path => "puppet/bootstrap.sh" |
|
||||
|
|
||||
# XXX Usando provisoriamente o modulo oficial ate que sincronizemos nosso repo |
|
||||
# XXX descomentar este trecho entao |
|
||||
|
|
||||
# config.vm.provision :shell, |
|
||||
# :path => "puppet/puppet_module_install_from_github.sh", |
|
||||
# :args => "jfryman-nginx interlegis/puppet-nginx" |
|
||||
|
|
||||
config.vm.provision :puppet do |puppet| |
|
||||
puppet.manifests_path = "puppet/manifests" |
|
||||
puppet.manifest_file = "site.pp" |
|
||||
end |
|
||||
|
|
||||
end |
|
@ -1,29 +0,0 @@ |
|||||
#!/bin/bash |
|
||||
|
|
||||
NAME="sigi" |
|
||||
DJANGODIR=/srv/sigi |
|
||||
VENVDIR=/srv/.virtualenvs/sigi/bin |
|
||||
SOCKFILE=/var/run/sigi/sigi.sock |
|
||||
USER=sigi |
|
||||
GROUP=sigi |
|
||||
NUM_WORKERS=3 # = 2 * CPUs + 1 |
|
||||
DJANGO_SETTINGS_MODULE=sigi.settings |
|
||||
DJANGO_WSGI_MODULE=sigi.wsgi |
|
||||
|
|
||||
echo "Starting $NAME as `whoami`" |
|
||||
|
|
||||
cd $DJANGODIR |
|
||||
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE |
|
||||
export PYTHONPATH=$DJANGODIR:$PYTHONPATH |
|
||||
|
|
||||
RUNDIR=$(dirname $SOCKFILE) |
|
||||
test -d $RUNDIR || mkdir -p $RUNDIR |
|
||||
|
|
||||
exec ${VENVDIR}/gunicorn ${DJANGO_WSGI_MODULE}:application \ |
|
||||
--name $NAME \ |
|
||||
--workers $NUM_WORKERS \ |
|
||||
--user=$USER --group=$GROUP \ |
|
||||
--log-level=debug \ |
|
||||
--timeout=180 \ |
|
||||
--graceful-timeout=180 \ |
|
||||
--bind=unix:$SOCKFILE |
|
@ -1,42 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
import pytest |
|
||||
from django_webtest import DjangoTestApp, WebTestMixin |
|
||||
|
|
||||
|
|
||||
DEFAULT_MARK = object() |
|
||||
|
|
||||
|
|
||||
class SigiTestApp(DjangoTestApp): |
|
||||
|
|
||||
def __init__(self, extra_environ=None, relative_to=None, default_user=None): |
|
||||
super(SigiTestApp, self).__init__(extra_environ, relative_to) |
|
||||
self.default_user = default_user |
|
||||
|
|
||||
def get(self, url, params=None, headers=None, extra_environ=None, |
|
||||
status=None, expect_errors=False, user=DEFAULT_MARK, auto_follow=True, |
|
||||
content_type=None, **kwargs): |
|
||||
# note we altered the default values for user and auto_follow |
|
||||
|
|
||||
if user is DEFAULT_MARK: # a trick to allow explicit user=None |
|
||||
user = self.default_user |
|
||||
|
|
||||
return super(SigiTestApp, self).get(url, params, headers, extra_environ, |
|
||||
status, expect_errors, user, auto_follow, |
|
||||
content_type, **kwargs) |
|
||||
|
|
||||
|
|
||||
@pytest.fixture(scope='function') |
|
||||
def app(request, admin_user): |
|
||||
"""WebTest's TestApp. |
|
||||
|
|
||||
Patch and unpatch settings before and after each test. |
|
||||
|
|
||||
WebTestMixin, when used in a unittest.TestCase, automatically calls |
|
||||
_patch_settings() and _unpatchsettings. |
|
||||
|
|
||||
source: https://gist.github.com/magopian/6673250 |
|
||||
""" |
|
||||
wtm = WebTestMixin() |
|
||||
wtm._patch_settings() |
|
||||
request.addfinalizer(wtm._unpatch_settings) |
|
||||
return SigiTestApp(default_user=admin_user.username) |
|
@ -1,17 +0,0 @@ |
|||||
NameVirtualHost 10.1.2.126:80 |
|
||||
<VirtualHost 10.1.2.126:80> |
|
||||
ServerName sigi01h.interlegis.leg.br |
|
||||
|
|
||||
WSGIScriptAlias /sigi /srv/sigi/sigi/wsgi.py |
|
||||
Alias /sigi/static /srv/sigi/static |
|
||||
Alias /sigi/sigiStatic /srv/sigi/sigiStatic |
|
||||
|
|
||||
ErrorLog /var/log/apache2/sigi-error.log |
|
||||
|
|
||||
# Possible values include: debug, info, notice, warn, error, crit, |
|
||||
# alert, emerg. |
|
||||
LogLevel warn |
|
||||
|
|
||||
CustomLog /var/log/apache2/sigi-access.log combined |
|
||||
ServerSignature Off |
|
||||
</VirtualHost> |
|
Binary file not shown.
@ -1,56 +0,0 @@ |
|||||
21/05/2012 |
|
||||
|
|
||||
Procedimento para importação de dados públicos obtidos do IBGE. |
|
||||
|
|
||||
- Tabela de Municípios: |
|
||||
Disponível desde 1940, foi atualizada a cada década entre os anos |
|
||||
1940 e 2000 e depois anualmente até a última atualização em 2009 (este |
|
||||
parágrafo foi escrito em maio de 2012). |
|
||||
|
|
||||
A atualização mais recente, portanto, é do ano de 2009. Considerando |
|
||||
que o formato de publicação tem variado bastante, o roteiro abaixo é |
|
||||
específico para os dados referentes ao ano 2009. |
|
||||
|
|
||||
- Procedimentos e instruções: |
|
||||
|
|
||||
1. Questões óbvias como configuração de PROXY são omitidas por não serem |
|
||||
relacionadas ao procedimento. |
|
||||
2. O diretório-base de referência no projeto é o raiz do projeto conforme |
|
||||
foi exportado do repositório, referenciado por $ |
|
||||
3. O URL-base de obtenção dos dados é: |
|
||||
|
|
||||
ftp://geoftp.ibge.gov.br |
|
||||
|
|
||||
4. Tornar o diretório corrente para: |
|
||||
|
|
||||
$/SIGI/trunk/etc/data/ibge |
|
||||
|
|
||||
5. Baixar o arquivo de 2009. O comando executado com sucesso considerando a |
|
||||
configuração da intranet do Interlegis na data corrente - maio de 2012 - é: |
|
||||
|
|
||||
wget -r --no-proxy ftp://geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/ organizacao_territorial/divisao_territorial/2009 |
|
||||
|
|
||||
(o comando acima criará o caminho local "geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/") |
|
||||
|
|
||||
6. Torne corrente o caminho onde o arquivo de 2009 está baixado: |
|
||||
|
|
||||
cd geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009 |
|
||||
|
|
||||
7. Expanda o arquivo obtido: |
|
||||
|
|
||||
unzip dtb_05_05_2009.zip |
|
||||
|
|
||||
8. Converta o arquivo expandido para o formato "CSV": |
|
||||
|
|
||||
xls2csv DTB_05_05_2009.xls > DTB_05_05_2009.csv |
|
||||
|
|
||||
9. Volte para o diretório-base do IBGE: |
|
||||
|
|
||||
$/SIGI/trunk/etc/data/ibge |
|
||||
|
|
||||
10. Execute o script de importação, cuja documentação dos processos encontra-se |
|
||||
nos fontes: |
|
||||
|
|
||||
sigi-import-ibge-2009.sh geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/DTB_05_05_2009.csv |
|
||||
|
|
||||
|
|
@ -1,43 +0,0 @@ |
|||||
import sys |
|
||||
import csv |
|
||||
|
|
||||
""" |
|
||||
""" |
|
||||
|
|
||||
_root_dict = None |
|
||||
|
|
||||
|
|
||||
def getUFdict(root, ufid): |
|
||||
return(root[ufid]) |
|
||||
|
|
||||
|
|
||||
def getCidadesDict(macrodict, microid): |
|
||||
if macrodict = None: |
|
||||
return(None) |
|
||||
microdoct = macrodict['__children'] |
|
||||
if microdict = None: |
|
||||
microdict = {} |
|
||||
macrodict['__children'] = microdict |
|
||||
|
|
||||
|
|
||||
def main(): |
|
||||
argc = len(sys.argv) |
|
||||
arquivo = open('geoftp.ibge.gov.br/organizacao_territorial/divisao_territorial/2009/DTB_05_05_2009.csv', 'r') |
|
||||
# despreza o cabecalho |
|
||||
arquivo.readline() |
|
||||
|
|
||||
lnum = 0 |
|
||||
csv_reader = csv.reader(arquivo, delimiter=',', quotechar='"') |
|
||||
for registro in csv_reader: |
|
||||
if uf[registro[0]] = None: |
|
||||
uf[registro[0]] = {} |
|
||||
uf[registro[0]]['nome'] = registro[1] |
|
||||
uf[registro[0]]['macrorregioes'] = {} |
|
||||
# print "lnum: %s - %s" % ( lnum, registro ) |
|
||||
lnum = lnum + 1 |
|
||||
if lnum >= 10: |
|
||||
break |
|
||||
|
|
||||
if __name__ = "__main__": |
|
||||
main() |
|
||||
dumpdicts() |
|
@ -1,179 +0,0 @@ |
|||||
#!/bin/sh |
|
||||
|
|
||||
arquivo_csv="" |
|
||||
limite=0 |
|
||||
|
|
||||
# Caso a variavel _DEBUG nao tenha sido preparada externamente, |
|
||||
# assumir que o default é sem DEBUG |
|
||||
if [ -z "${_DEBUG}" ] |
|
||||
then |
|
||||
_DEBUG="0" |
|
||||
fi |
|
||||
|
|
||||
# Default verboso |
|
||||
if [ -z "${_VERBOSE}" ] |
|
||||
then |
|
||||
_VERBOSE="1" |
|
||||
fi |
|
||||
|
|
||||
PrintDebug( ) |
|
||||
{ |
|
||||
# para a mensagem ser mostrada, _DEBUG deve ser configurada |
|
||||
# e o valor deve ser diferente de "0" |
|
||||
if [ -n "${_DEBUG}" -a "${_DEBUG}" -ne "0" ] |
|
||||
then |
|
||||
echo "$@" |
|
||||
fi |
|
||||
} |
|
||||
|
|
||||
PrintHelp( ) |
|
||||
{ |
|
||||
PrintMessage `basename "${0}"` " -- importa tabelas de cidades do IBGE" |
|
||||
PrintMessage "Opcoes aceitas:" |
|
||||
PrintMessage " arquivo_csv=[caminho]" |
|
||||
PrintMessage " informa o caminho para o arquivo no formato 2009" |
|
||||
PrintMessage " limite=N" |
|
||||
PrintMessage " determina a quantidade maxima de registros de entrada processados" |
|
||||
PrintMessage " _VERBOSE=[verbose]" |
|
||||
PrintMessage " 0 para nao mostrar mensagens, 1 para mostrar" |
|
||||
PrintMessage " _DEBUG=[debug]" |
|
||||
PrintMessage " 0 para nao mostrar mensagens de depuracao, 1 para mostrar" |
|
||||
} |
|
||||
|
|
||||
PrintMessage( ) |
|
||||
{ |
|
||||
# para a mensagem NAO ser mostrada, _VERBOSE deve ser configurada |
|
||||
# e o valor deve ser "0" |
|
||||
if [ -z "${_VERBOSE}" -o "${_VERBOSE}" -ne "0" ] |
|
||||
then |
|
||||
echo "$@" |
|
||||
fi |
|
||||
} |
|
||||
|
|
||||
# Processar os argumentos passados pela linha de comando. Devem estar no |
|
||||
# formato de atribuicao de variaveis em Shell, ou entao devem ser atribuidos |
|
||||
# e exportados pelo processo chamador. Caso na expressao [var]=[valor] exista |
|
||||
# separadores, todo o argumento deve estar entre aspas: "[var]=[valor]" |
|
||||
while [ "${#}" -gt 0 ] |
|
||||
do |
|
||||
if echo "${1}" | grep "=" 2>&1 > /dev/null |
|
||||
then |
|
||||
PrintDebug "Argumento de configuracao: \"${1}\"" |
|
||||
eval "${1}" |
|
||||
else |
|
||||
PrintDebug "Argumento desconhecido: \"${1}\"" |
|
||||
PrintHelp |
|
||||
exit 1 |
|
||||
fi |
|
||||
|
|
||||
shift |
|
||||
done |
|
||||
|
|
||||
#################################### |
|
||||
# Secao de validacao de parametros |
|
||||
if [ -z "${arquivo_csv}" ] |
|
||||
then |
|
||||
PrintMessage "ERRO: informe o arquivo de importacao." |
|
||||
PrintHelp |
|
||||
exit 2 |
|
||||
fi |
|
||||
|
|
||||
if [ ! -f "${arquivo_csv}" ] |
|
||||
then |
|
||||
PrintMessage "ERRO: o arquivo de importacao nao existe ou nao pode ser acessado (\"${arquivo_csv}\")." |
|
||||
PrintHelp |
|
||||
exit 3 |
|
||||
fi |
|
||||
|
|
||||
if [ ! -r "${arquivo_csv}" ] |
|
||||
then |
|
||||
PrintMessage "ERRO: o arquivo de importacao nao pode ser lido (\"${arquivo_csv}\")." |
|
||||
PrintHelp |
|
||||
exit 4 |
|
||||
fi |
|
||||
|
|
||||
# filtrar o arquivo original para area de trabalho, por |
|
||||
# UF, Mesorregiao, Microrregiao, Municipio e depois executar |
|
||||
# os scripts Python para atualização do banco. |
|
||||
# O formato do arquivo obtido do IBGE e' CSV com as seguintes colunas: |
|
||||
# |
|
||||
# 1: "UF" |
|
||||
# 2: "Nome_UF" |
|
||||
# 3: "MesorregiãoGeográfica" |
|
||||
# 4: "MesorregiãoGeográfica_Nome" |
|
||||
# 5: "MicrorregiãoGeográfica" |
|
||||
# 6: "MicrorregiãoGeográfica_Nome" |
|
||||
# 7: "Município" |
|
||||
# 8: "Município_Nome" |
|
||||
# 9: "Distrito" |
|
||||
# 10: "Distrito_Nome" |
|
||||
# 11: "Subdistrito" |
|
||||
# 12: "Subdistrito_Nome" |
|
||||
|
|
||||
nome_base=sigi_ibge_import |
|
||||
niveis="uf mesorregiao microrregiao municipio" |
|
||||
for nivel in $niveis |
|
||||
do |
|
||||
eval "arquivo_${nivel}=/tmp/${nome_base}.${nivel}.csv" |
|
||||
done |
|
||||
|
|
||||
exec 3< "${arquivo_csv}" 4> "${arquivo_uf}" 5> "${arquivo_mesorregiao}" 6> "${arquivo_microrregiao}" 7> "${arquivo_municipio}" |
|
||||
|
|
||||
lnum=0 |
|
||||
|
|
||||
PrintMessage "Iniciando leitura dos dados..." |
|
||||
|
|
||||
read linha <&3 |
|
||||
while read linha <&3 |
|
||||
do |
|
||||
lnum=$(($lnum + 1)) |
|
||||
if [ $(($lnum % 100)) -eq 0 ] |
|
||||
then |
|
||||
PrintMessage -n "${lnum} " |
|
||||
fi |
|
||||
# extrair o codigo da regiao a partir do codigo da UF |
|
||||
# e criar o novo campo 1 com o codigo da regiao |
|
||||
codregiao=`echo "$linha" | cut -b2-2` |
|
||||
linha="\"${codregiao}\",$linha" |
|
||||
# UFs: cod_regiao,cod_uf,nome_uf |
|
||||
# -- a sigla por enquanto devera ser adicionada manualmente |
|
||||
echo "$linha" | cut -s -d, -f1,2,3 >&4 |
|
||||
# Mesorregiao: cod_regiao,cod_uf,cod_mesorregiao,nome_mesorregiao |
|
||||
echo "$linha" | cut -s -d, -f1,2,4,5 >&5 |
|
||||
# Microrregiao: cod_regiao,cod_uf,cod_mesorregiao,cod_microrregiao,nome_microrregiao |
|
||||
echo "$linha" | cut -s -d, -f1,2,4,6,7 >&6 |
|
||||
# Municipio: cod_regiao,cod_uf,cod_mesorregiao,cod_microrregiao,cod_municipio,nome_municipio |
|
||||
# 7> "${arquivo_municipio}" |
|
||||
echo "$linha" | cut -s -d, -f1,2,4,6,8,9 >&7 |
|
||||
if [ -n "${limite}" -a "${limite}" -gt 0 -a "${lnum}" -ge "${limite}" ] |
|
||||
then |
|
||||
break |
|
||||
fi |
|
||||
done |
|
||||
|
|
||||
PrintMessage "\n${lnum} registros processados" |
|
||||
|
|
||||
# fecha os descritores de saida |
|
||||
exec 3<&- 4>&- 5>&- 6>&- 7>&- |
|
||||
|
|
||||
for nivel in $niveis |
|
||||
do |
|
||||
eval "arq_in=/tmp/${nome_base}.${nivel}.csv" |
|
||||
eval "arq_out=/tmp/${nome_base}.${nivel}.csv.tmp" |
|
||||
sort < $arq_in > $arq_out |
|
||||
uniq < $arq_out > $arq_in |
|
||||
rm $arq_out |
|
||||
done |
|
||||
|
|
||||
ifs="$IFS" |
|
||||
IFS=" |
|
||||
" |
|
||||
for l in `wc -l /tmp/${nome_base}*` |
|
||||
do |
|
||||
PrintDebug $l |
|
||||
done |
|
||||
IFS="$ifs" |
|
||||
|
|
||||
# Processar arquivos: INSERT ou UPDATE no banco |
|
||||
|
|
||||
|
|
Can't render this file because it contains an unexpected character in line 58 and column 10.
|
Can't render this file because it has a wrong number of fields in line 56.
|
File diff suppressed because it is too large
|
|
File diff suppressed because it is too large
@ -1,439 +0,0 @@ |
|||||
#!/usr/bin/env python |
|
||||
# -*- coding: utf-8 -*- |
|
||||
|
|
||||
""" |
|
||||
Script para fazer a migração dos dados do SIGI antigo (Access), exportados para |
|
||||
CSV, para o novo SIGI. |
|
||||
|
|
||||
Conversão dos dados para CSV:: |
|
||||
|
|
||||
mdb-export -d "|" -D "%Y-%m-%d" <database>.mdb "Assembléias" > assembleias.csv |
|
||||
mdb-export -d "|" -D "%Y-%m-%d" <database>.mdb "municipios" > casas.csv |
|
||||
mdb-export -d "|" -D "%Y-%m-%d" <database>.mdb "CNPJ DAS CM" > cnpj.csv |
|
||||
|
|
||||
Coloque os arquivos no diretório deste script e execute ``./migra.py`` para |
|
||||
fazer a migração. |
|
||||
|
|
||||
Nota: é recomendado que o banco de dados esteja em seu estado inicial (de |
|
||||
pós-instalação) para a migração dos dados. Este script não foi feito para um |
|
||||
banco de dados em produção. |
|
||||
""" |
|
||||
|
|
||||
from django.core.management import setup_environ |
|
||||
|
|
||||
from sigi import settings |
|
||||
setup_environ(settings) |
|
||||
|
|
||||
import csv |
|
||||
from datetime import datetime |
|
||||
from sigi.apps.casas.models import * |
|
||||
from sigi.apps.contatos.models import * |
|
||||
from sigi.apps.convenios.models import * |
|
||||
from sigi.apps.inventario.models import * |
|
||||
from sigi.apps.parlamentares.models import * |
|
||||
|
|
||||
ERROR_MSG_0 = ('<ERRO> %s[%s]: erro desconhecido! Possível erro de integridade ' |
|
||||
'do banco de dados. Favor verificar e inserir manualmente caso ' |
|
||||
'necessário.') |
|
||||
ERROR_MSG_1 = ('<ERRO> %s[%s]: erro ao inserir item, será necessário inserção ' |
|
||||
'manual.') |
|
||||
OBS_CONVENIO = ('Convênio sem termo de adesão') |
|
||||
|
|
||||
|
|
||||
def migra_assembleias(filename): |
|
||||
# identificação das colunas nos arquivo CSV |
|
||||
UF_COL = 5 |
|
||||
NOME_COL = 8 |
|
||||
FONE_1_COL = 32 |
|
||||
FONE_2_COL = 33 |
|
||||
FAX_COL = 34 |
|
||||
FONE_PREFEITURA = 35 |
|
||||
OBS_COL = 37 |
|
||||
PRESIDENTE_COL = 38 |
|
||||
ENDERECO_COL = 39 |
|
||||
CEP_COL = 40 |
|
||||
EMAIL_COL = 41 |
|
||||
EMAIL_PRESIDENTE_COL = 42 |
|
||||
PAGINA_COL = 43 |
|
||||
#REPRESENTANTE_COL = 86 |
|
||||
|
|
||||
reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) |
|
||||
header = reader.next() |
|
||||
|
|
||||
tipo_casa = TipoOrgao.objects.filter(sigla='AL').get() |
|
||||
|
|
||||
for line in reader: |
|
||||
uf = UnidadeFederativa.objects.get(sigla=line[UF_COL]) |
|
||||
municipio = Municipio.objects.get(uf=uf, is_capital=True) |
|
||||
aux_end = line[ENDERECO_COL].split('-') |
|
||||
bairro = '' |
|
||||
if(aux_end.__len__() > 1): |
|
||||
bairro = aux_end[1].replace(' ', '', 1) |
|
||||
else: |
|
||||
bairro = '' |
|
||||
casa = Orgao( |
|
||||
municipio=municipio, |
|
||||
nome=line[NOME_COL], |
|
||||
tipo=tipo_casa, |
|
||||
logradouro=aux_end[0], |
|
||||
bairro=bairro, |
|
||||
cep=line[CEP_COL], |
|
||||
email=line[EMAIL_COL], |
|
||||
pagina_web=line[PAGINA_COL], |
|
||||
observacoes=line[OBS_COL], |
|
||||
presidente=line[PRESIDENTE_COL], |
|
||||
telefone=line[FONE_1_COL] |
|
||||
) |
|
||||
if line[UF_COL] == 'DF': |
|
||||
casa.tipo = TipoOrgao.objects.filter(sigla='CT').get() |
|
||||
casa.save() |
|
||||
|
|
||||
if line[FONE_2_COL]: |
|
||||
fone2 = Telefone(numero=line[FONE_2_COL], tipo='I', content_object=casa) |
|
||||
fone2.save() |
|
||||
if line[FAX_COL]: |
|
||||
fax = Telefone(numero=line[FAX_COL], tipo='X', content_object=casa) |
|
||||
fax.save() |
|
||||
if line[FONE_PREFEITURA]: |
|
||||
fone_prefeitura = Telefone( |
|
||||
numero=line[FONE_PREFEITURA], |
|
||||
tipo='F', |
|
||||
content_object=casa, |
|
||||
nota='Telefone da Prefeitura.' |
|
||||
) |
|
||||
fone_prefeitura.save() |
|
||||
# Presidente será um atributo de casa legislativa |
|
||||
# if line[REPRESENTANTE_COL]: |
|
||||
# representante = Contato(nome=line[REPRESENTANTE_COL], content_object=casa) |
|
||||
# representante.save() |
|
||||
|
|
||||
# if line[PRESIDENTE_COL]: |
|
||||
# mesa = MesaDiretora(casa_legislativa=casa) |
|
||||
# mesa.save() |
|
||||
# parlamentar = Parlamentar(nome_completo=line[PRESIDENTE_COL], email=line[EMAIL_PRESIDENTE_COL]) |
|
||||
# parlamentar.save() |
|
||||
# cargo_presidente = Cargo.objects.get(descricao__iexact='presidente') |
|
||||
# presidente = MembroMesaDiretora( |
|
||||
# parlamentar=parlamentar, |
|
||||
# cargo=cargo_presidente, |
|
||||
# mesa_diretora=mesa |
|
||||
# ) |
|
||||
# presidente.save() |
|
||||
|
|
||||
|
|
||||
def migra_casas(filename): |
|
||||
# identificação das colunas no arquivo CSV |
|
||||
COD_IBGE_COL = 1 |
|
||||
COD_TSE_COL = 2 |
|
||||
NOME_COL = 8 |
|
||||
ENDERECO_COL = 40 |
|
||||
CEP_COL = 41 |
|
||||
EMAIL_COL = 42 |
|
||||
PAGINA_COL = 44 |
|
||||
OBS_COL = 38 |
|
||||
FONE_1_COL = 33 |
|
||||
FONE_2_COL = 34 |
|
||||
FAX_COL = 35 |
|
||||
FONE_PREFEITURA = 36 |
|
||||
PRESIDENTE_COL = 39 |
|
||||
EMAIL_PRESIDENTE_COL = 43 |
|
||||
REPRESENTANTE_COL = 85 |
|
||||
|
|
||||
reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) |
|
||||
header = reader.next() |
|
||||
tipo_casa = TipoOrgao.objects.filter(sigla='CM').get() |
|
||||
|
|
||||
linenum = 1 |
|
||||
for line in reader: |
|
||||
linenum += 1 |
|
||||
try: |
|
||||
municipio = Municipio.objects.get(codigo_ibge=line[COD_IBGE_COL]) |
|
||||
except Municipio.DoesNotExist: |
|
||||
print "Municipio não existe" |
|
||||
print ERROR_MSG_1 % (filename, linenum) |
|
||||
continue |
|
||||
except ValueError: |
|
||||
print ERROR_MSG_1 % (filename, linenum) |
|
||||
continue |
|
||||
|
|
||||
aux_end = line[ENDERECO_COL].split('-') |
|
||||
bairro = '' |
|
||||
if(aux_end.__len__() > 1): |
|
||||
bairro = aux_end[1].replace(' ', '', 1) |
|
||||
casa = Orgao( |
|
||||
municipio=municipio, |
|
||||
nome='Câmara Municipal de ' + line[NOME_COL], |
|
||||
tipo=tipo_casa, |
|
||||
logradouro=aux_end[0], |
|
||||
bairro=bairro, |
|
||||
cep=line[CEP_COL], |
|
||||
email=line[EMAIL_COL], |
|
||||
pagina_web=line[PAGINA_COL], |
|
||||
observacoes=line[OBS_COL], |
|
||||
presidente=line[PRESIDENTE_COL], |
|
||||
telefone=line[FONE_1_COL] |
|
||||
) |
|
||||
|
|
||||
try: |
|
||||
casa.save() |
|
||||
except: |
|
||||
print "Erro ao inserir casa..." |
|
||||
print ERROR_MSG_0 % (filename, linenum) |
|
||||
continue |
|
||||
|
|
||||
if line[FONE_2_COL]: |
|
||||
fone2 = Telefone(numero=line[FONE_2_COL], tipo='I', content_object=casa) |
|
||||
fone2.save() |
|
||||
if line[FAX_COL]: |
|
||||
fax = Telefone(numero=line[FAX_COL], tipo='X', content_object=casa) |
|
||||
fax.save() |
|
||||
if line[FONE_PREFEITURA]: |
|
||||
fone_prefeitura = Telefone( |
|
||||
numero=line[FONE_PREFEITURA], |
|
||||
tipo='F', |
|
||||
content_object=casa, |
|
||||
nota='Telefone da Prefeitura.' |
|
||||
) |
|
||||
fone_prefeitura.save() |
|
||||
|
|
||||
if line[REPRESENTANTE_COL]: |
|
||||
representante = Contato(nome=line[REPRESENTANTE_COL], content_object=casa) |
|
||||
representante.save() |
|
||||
|
|
||||
|
|
||||
def migra_cnpj(filename): |
|
||||
# identificação das colunas no arquivo CSV |
|
||||
COD_TSE_COL = 0 |
|
||||
COD_CNPJ1_COL = 3 |
|
||||
COD_CNPJ2_COL = 4 |
|
||||
|
|
||||
reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) |
|
||||
header = reader.next() |
|
||||
linenum = 1 |
|
||||
for line in reader: |
|
||||
linenum += 1 |
|
||||
|
|
||||
try: |
|
||||
casa = Orgao.objects.get(municipio__codigo_tse=line[COD_TSE_COL]) |
|
||||
except Orgao.DoesNotExist: |
|
||||
print ERROR_MSG_1 % (filename, linenum) |
|
||||
continue |
|
||||
except Orgao.MultipleObjectsReturned: |
|
||||
print ERROR_MSG_1 % (filename, linenum) |
|
||||
continue |
|
||||
except ValueError: |
|
||||
print ERROR_MSG_1 % (filename, linenum) |
|
||||
continue |
|
||||
casa.cnpj = line[COD_CNPJ1_COL] if not 'EM BRANCO' in line[COD_CNPJ1_COL] else line[COD_CNPJ2_COL] |
|
||||
casa.save() |
|
||||
|
|
||||
|
|
||||
def migra_convenios_casas(filename): |
|
||||
def get_datetime_obj(data): |
|
||||
ldata = data.split('-') |
|
||||
if len(ldata) != 3: |
|
||||
return None |
|
||||
return datetime(int(ldata[0]), int(ldata[1]), int(ldata[2])) |
|
||||
|
|
||||
# identificação das colunas no arquivo CSV |
|
||||
# No arquivo CSV colunas que contém _100 são do Programa Interlegis |
|
||||
COD_IBGE_COL = 1 |
|
||||
|
|
||||
DATA_ADESAO_COL = 10 |
|
||||
DATA_TERMO_ACEITE_COL = 21 |
|
||||
NUM_CONVENIO_COL = 23 |
|
||||
DATA_POSTAGEM_CORREIO = 26 |
|
||||
NUM_PROCESSO_SF_COL = 27 |
|
||||
DATA_RETORNO_ASSINATURA = 28 |
|
||||
DATA_PUB_DIARIO = 30 |
|
||||
DATA_DEV_VIA_CONV_CM = 32 |
|
||||
|
|
||||
DATA_ADESAO_100_COL = 11 |
|
||||
DATA_TERMO_ACEITE_100_COL = 22 |
|
||||
NUM_CONVENIO_100_COL = 24 |
|
||||
NUM_PROCESSO_SF_100_COL = 25 |
|
||||
DATA_RETORNO_ASSINATURA_100_COL = 29 |
|
||||
DATA_PUB_DIARIO_100_COL = 31 |
|
||||
# DATA_DEV_VIA_CONV_CM_100 = 32 Não foi registrado para as 100 |
|
||||
#DATA_POSTAGEM_CORREIO_100 = 26 |
|
||||
|
|
||||
reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) |
|
||||
header = reader.next() |
|
||||
linenum = 1 |
|
||||
###Geração de arquivos para análise### |
|
||||
import codecs |
|
||||
f1 = codecs.open('file1.txt', 'w', encoding="utf-8") |
|
||||
f1.write(u'Casas que não tem Número Processo Senado Federal\n') |
|
||||
f2 = codecs.open('file2.txt', 'w', encoding="utf-8") |
|
||||
f2.write(u'Casas que não tem data de adesão e não tem convênio mas recebeu equipamentos\n') |
|
||||
###### |
|
||||
for line in reader: |
|
||||
linenum += 1 |
|
||||
|
|
||||
try: |
|
||||
casa = Orgao.objects.get(municipio__codigo_ibge=line[COD_IBGE_COL]) |
|
||||
except Orgao.DoesNotExist: |
|
||||
print "Erro ao inserir convênio. Casa não existe" |
|
||||
print ERROR_MSG_1 % (filename, linenum) |
|
||||
continue |
|
||||
except Orgao.MultipleObjectsReturned: |
|
||||
print ERROR_MSG_1 % (filename, linenum) |
|
||||
continue |
|
||||
except ValueError: |
|
||||
print ERROR_MSG_1 % (filename, linenum) |
|
||||
continue |
|
||||
|
|
||||
# Se o convênio não tiver data de adesão mas tiver data retorno assinatura copiar essa data para a data de adesão. |
|
||||
obs = '' |
|
||||
projeto = None |
|
||||
convenio1 = None |
|
||||
convenio2 = None |
|
||||
if line[DATA_ADESAO_COL] == '1001-01-01' and line[DATA_RETORNO_ASSINATURA].__len__() != 0: |
|
||||
line[DATA_ADESAO_COL] = line[DATA_RETORNO_ASSINATURA] |
|
||||
obs = OBS_CONVENIO |
|
||||
|
|
||||
if line[DATA_ADESAO_COL] != '1001-01-01': |
|
||||
projeto = Projeto.objects.get(id=1) |
|
||||
|
|
||||
if projeto: |
|
||||
convenio1 = Convenio( |
|
||||
casa_legislativa=casa, |
|
||||
projeto=projeto, |
|
||||
num_processo_sf=line[NUM_PROCESSO_SF_COL], |
|
||||
num_convenio=line[NUM_CONVENIO_COL], |
|
||||
data_adesao=get_datetime_obj(line[DATA_ADESAO_COL]), |
|
||||
data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_COL]), |
|
||||
data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA]), |
|
||||
data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO]), |
|
||||
data_devolucao_via=get_datetime_obj(line[DATA_DEV_VIA_CONV_CM]), |
|
||||
data_postagem_correio=get_datetime_obj(line[DATA_POSTAGEM_CORREIO]), |
|
||||
observacao=obs,) |
|
||||
|
|
||||
###Relatório### |
|
||||
if((projeto or line[DATA_TERMO_ACEITE_COL]) and line[NUM_PROCESSO_SF_COL].__len__() == 0): |
|
||||
f1.write(casa.nome + "," + casa.municipio.uf.sigla + "\n") |
|
||||
if(projeto is None and line[DATA_TERMO_ACEITE_COL].__len__() != 0): |
|
||||
f2.write(casa.nome + "," + casa.municipio.uf.sigla + "\n") |
|
||||
###### |
|
||||
projeto = None |
|
||||
obs = '' |
|
||||
if line[DATA_ADESAO_100_COL] == '1001-01-01' and line[DATA_RETORNO_ASSINATURA_100_COL].__len__() != 0: |
|
||||
line[DATA_ADESAO_100_COL] = line[DATA_RETORNO_ASSINATURA_100_COL] |
|
||||
obs = OBS_CONVENIO |
|
||||
if line[DATA_ADESAO_100_COL] != '1001-01-01': |
|
||||
projeto = Projeto.objects.get(id=2) |
|
||||
|
|
||||
if projeto: |
|
||||
convenio2 = Convenio( |
|
||||
casa_legislativa=casa, |
|
||||
projeto=projeto, |
|
||||
num_processo_sf=line[NUM_PROCESSO_SF_100_COL], |
|
||||
num_convenio=line[NUM_CONVENIO_100_COL], |
|
||||
data_adesao=get_datetime_obj(line[DATA_ADESAO_100_COL]), |
|
||||
data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_100_COL]), |
|
||||
data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA_100_COL]), |
|
||||
data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO_100_COL]), |
|
||||
observacao=obs, |
|
||||
) |
|
||||
|
|
||||
try: |
|
||||
if convenio1: |
|
||||
convenio1.save() |
|
||||
if convenio2: |
|
||||
convenio2.save() |
|
||||
except: |
|
||||
print "Erro ao inserir convênio" |
|
||||
print ERROR_MSG_0 % (filename, linenum) |
|
||||
continue |
|
||||
f1.close() |
|
||||
f2.close() |
|
||||
|
|
||||
|
|
||||
def migra_convenios_assembleias(filename): |
|
||||
def get_datetime_obj(data): |
|
||||
ldata = data.split('-') |
|
||||
if len(ldata) != 3: |
|
||||
return None |
|
||||
return datetime(int(ldata[0]), int(ldata[1]), int(ldata[2])) |
|
||||
|
|
||||
# identificação das colunas no arquivo CSV |
|
||||
SIGLA_COL = 5 |
|
||||
DATA_ADESAO_COL = 10 |
|
||||
DATA_TERMO_ACEITE_COL = 21 |
|
||||
NUM_CONVENIO_COL = 23 |
|
||||
NUM_PROCESSO_SF_COL = 26 |
|
||||
DATA_RETORNO_ASSINATURA = 27 |
|
||||
DATA_PUB_DIARIO = 29 |
|
||||
|
|
||||
reader = csv.reader(open(filename, 'r'), delimiter='|', skipinitialspace=True) |
|
||||
header = reader.next() |
|
||||
linenum = 1 |
|
||||
tipo_casa = TipoOrgao.objects.filter(sigla='AL').get() |
|
||||
for line in reader: |
|
||||
linenum += 1 |
|
||||
|
|
||||
try: |
|
||||
assembleia = Orgao.objects.get(municipio__uf__sigla=line[SIGLA_COL], tipo=tipo_casa) |
|
||||
except Orgao.DoesNotExist: |
|
||||
print ERROR_MSG_1 % (filename, linenum) |
|
||||
continue |
|
||||
except Orgao.MultipleObjectsReturned: |
|
||||
print ERROR_MSG_1 % (filename, linenum) |
|
||||
continue |
|
||||
except ValueError: |
|
||||
print ERROR_MSG_1 % (filename, linenum) |
|
||||
continue |
|
||||
projeto = Projeto.objects.get(id=2) |
|
||||
convenio = Convenio( |
|
||||
casa_legislativa=assembleia, |
|
||||
num_processo_sf=line[NUM_PROCESSO_SF_COL], |
|
||||
num_convenio=line[NUM_CONVENIO_COL], |
|
||||
projeto=projeto, |
|
||||
data_adesao=get_datetime_obj(line[DATA_ADESAO_COL]), |
|
||||
data_retorno_assinatura=get_datetime_obj(line[DATA_TERMO_ACEITE_COL]), |
|
||||
data_pub_diario=get_datetime_obj(line[DATA_RETORNO_ASSINATURA]), |
|
||||
data_termo_aceite=get_datetime_obj(line[DATA_PUB_DIARIO]), |
|
||||
) |
|
||||
try: |
|
||||
convenio.save() |
|
||||
except: |
|
||||
print ERROR_MSG_0 % (filename, linenum) |
|
||||
print convenio |
|
||||
continue |
|
||||
|
|
||||
|
|
||||
def popula(): |
|
||||
""" |
|
||||
Será preciso cadastrar no banco os seguintes Projeto: |
|
||||
1 - Projeto Interlegis |
|
||||
2 - Projeto Piloto de Modernização |
|
||||
3 - Projeto Modernização Legislativo |
|
||||
""" |
|
||||
|
|
||||
projeto1 = Projeto(sigla='PI', nome='Projeto Interlegis') |
|
||||
projeto1.save() |
|
||||
projeto2 = Projeto(sigla='PPM', nome='Projeto Piloto de Modernização') |
|
||||
projeto2.save() |
|
||||
projeto3 = Projeto(sigla='PML', nome='Projeto Modernização Legislativo') |
|
||||
projeto3.save() |
|
||||
|
|
||||
tipo1 = TipoOrgao(sigla='CM', nome='Câmara Municipal') |
|
||||
tipo1.save() |
|
||||
tipo2 = TipoOrgao(sigla='AL', nome='Assembléia Legislativa') |
|
||||
tipo2.save() |
|
||||
tipo3 = TipoOrgao(sigla='CT', nome='Câmara Distrital') |
|
||||
tipo3.save() |
|
||||
|
|
||||
|
|
||||
if __name__ == '__main__': |
|
||||
popula() |
|
||||
print "<iniciando migração das assembléias legislativas>" |
|
||||
migra_assembleias('assembleias.csv') |
|
||||
print "<iniciando migração das demais casas legislativas>" |
|
||||
migra_casas('casas.csv') |
|
||||
print "<iniciando migração dos CNPJ das casas>" |
|
||||
migra_cnpj('cnpj.csv') |
|
||||
print "<iniciando migração dos convênios das casas municipais>" |
|
||||
migra_convenios_casas('casas.csv') |
|
||||
print "<iniciando migração dos convênios das assembléias>" |
|
||||
migra_convenios_assembleias('assembleias.csv') |
|
@ -1,31 +0,0 @@ |
|||||
upstream sigi_app_server { |
|
||||
server unix:/var/run/sigi/sigi.sock fail_timeout=0; |
|
||||
} |
|
||||
|
|
||||
server { |
|
||||
listen 80; |
|
||||
server_name sigi01h.interlegis.leg.br; |
|
||||
|
|
||||
client_max_body_size 4G; |
|
||||
|
|
||||
access_log /var/log/sigi/sigi-access.log; |
|
||||
error_log /var/log/sigi/sigi-error.log; |
|
||||
|
|
||||
location /static/ { |
|
||||
alias /srv/sigi/static/; |
|
||||
} |
|
||||
|
|
||||
location /media/ { |
|
||||
alias /srv/sigi/media/; |
|
||||
} |
|
||||
|
|
||||
location / { |
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
|
||||
proxy_set_header Host $http_host; |
|
||||
proxy_redirect off; |
|
||||
if (!-f $request_filename) { |
|
||||
proxy_pass http://sigi_app_server; |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
} |
|
@ -1,5 +0,0 @@ |
|||||
[program:sigi] |
|
||||
command = /srv/sigi/bin/run_sigi |
|
||||
user = sigi |
|
||||
stdout_logfile = /var/log/sigi/sigi-supervisor.log |
|
||||
redirect_stderr = true |
|
@ -1,39 +0,0 @@ |
|||||
#!/bin/bash |
|
||||
|
|
||||
THIS_SHELL=`ps --no-heading -p $$ | awk '{print $4}'` |
|
||||
if [ $THIS_SHELL != 'bash' ] ; then |
|
||||
echo "Você está executando este script com o interpretador '$THIS_SHELL'" |
|
||||
echo "mas ele só funciona com o 'bash'." |
|
||||
echo "Tente executar usando 'bash install.sh'." |
|
||||
exit 1 |
|
||||
fi |
|
||||
|
|
||||
echo "Instalando python-pip, python-dev e python-psycopg2..." |
|
||||
sudo apt-get install -y python-pip python-dev python-virtualenv |
|
||||
|
|
||||
echo "Criando virtualenv..." |
|
||||
virtualenv ./env/ |
|
||||
|
|
||||
echo "Instalando pacotes python requeridos pelo SIGI..." |
|
||||
pip install --environment=./env/ -r requirements.txt |
|
||||
|
|
||||
echo "Ativando o virtualenv..." |
|
||||
source ./env/bin/activate |
|
||||
|
|
||||
echo "Isolando arquivos temporários..." |
|
||||
mkdir tmp |
|
||||
|
|
||||
echo "Instalando geraldo reports..." |
|
||||
git clone git@github.com:marinho/geraldo.git |
|
||||
cd geraldo |
|
||||
python setup.py install |
|
||||
cp -Rfv reporting geraldo `python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"` |
|
||||
cd .. |
|
||||
|
|
||||
echo "Excluindo arquivos temporários..." |
|
||||
cd .. |
|
||||
rm -Rf tmp |
|
||||
|
|
||||
echo "Criando e populando o banco de dados..." |
|
||||
pwd |
|
||||
python manage.py syncdb |
|
@ -1,10 +1,22 @@ |
|||||
#!/usr/bin/env python |
#!/usr/bin/env python |
||||
|
"""Django's command-line utility for administrative tasks.""" |
||||
import os |
import os |
||||
import sys |
import sys |
||||
|
|
||||
if __name__ == "__main__": |
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sigi.settings") |
|
||||
|
|
||||
from django.core.management import execute_from_command_line |
|
||||
|
|
||||
|
def main(): |
||||
|
"""Run administrative tasks.""" |
||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sigi.settings') |
||||
|
try: |
||||
|
from django.core.management import execute_from_command_line |
||||
|
except ImportError as exc: |
||||
|
raise ImportError( |
||||
|
"Couldn't import Django. Are you sure it's installed and " |
||||
|
"available on your PYTHONPATH environment variable? Did you " |
||||
|
"forget to activate a virtual environment?" |
||||
|
) from exc |
||||
execute_from_command_line(sys.argv) |
execute_from_command_line(sys.argv) |
||||
|
|
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
main() |
||||
|
@ -1,13 +0,0 @@ |
|||||
#!/bin/bash |
|
||||
|
|
||||
puppet_install () { |
|
||||
puppet module list | grep $1 || puppet module install $1 |
|
||||
} |
|
||||
|
|
||||
puppet_install puppetlabs-vcsrepo |
|
||||
puppet_install stankevich-python |
|
||||
|
|
||||
# XXX Usando provisoriamente o modulo oficial ate que sincronizemos nosso repo |
|
||||
# XXX retirar esta linha entao |
|
||||
puppet_install jfryman-nginx |
|
||||
|
|
@ -1,212 +0,0 @@ |
|||||
Exec { |
|
||||
path => '/usr/bin:/usr/sbin:/bin:/usr/local/bin', |
|
||||
} |
|
||||
|
|
||||
group { 'sigi': |
|
||||
ensure => 'present', |
|
||||
} |
|
||||
|
|
||||
user { 'sigi': |
|
||||
ensure => 'present', |
|
||||
system => true, |
|
||||
gid => 'sigi', |
|
||||
require => Group['sigi'] |
|
||||
} |
|
||||
|
|
||||
$package_deps = [ |
|
||||
# gerais |
|
||||
'git', 'supervisor', 'memcached', |
|
||||
|
|
||||
# para psycopg ('python-dev' ja eh instalado pelo modulo python) |
|
||||
'libpq-dev', |
|
||||
|
|
||||
# para ldap |
|
||||
'libldap2-dev', 'libsasl2-dev', 'libssl-dev'] |
|
||||
|
|
||||
package { $package_deps: } |
|
||||
|
|
||||
$sigi_dir = '/srv/sigi' |
|
||||
$sigidata_dir = '/srv/sigidata' |
|
||||
|
|
||||
vcsrepo { $sigi_dir: |
|
||||
ensure => latest, |
|
||||
provider => git, |
|
||||
source => 'https://github.com/interlegis/sigi.git', |
|
||||
revision => 'producao', |
|
||||
require => Package['git'], |
|
||||
} |
|
||||
|
|
||||
file { [ |
|
||||
'/var/log/sigi', |
|
||||
'/var/run/sigi', |
|
||||
]: |
|
||||
ensure => 'directory', |
|
||||
owner => 'sigi', |
|
||||
group => 'sigi', |
|
||||
require => Vcsrepo[$sigi_dir], |
|
||||
} |
|
||||
|
|
||||
file { "${sigi_dir}/media": |
|
||||
ensure => link, |
|
||||
target => "${sigidata_dir}/media", |
|
||||
} |
|
||||
|
|
||||
# TODO A pasta "${sigi_dir}/media" deve ser compartilhada entre instancias de cluster |
|
||||
|
|
||||
file { '/var/log/sigi/sigi-supervisor.log': |
|
||||
ensure => file, |
|
||||
} |
|
||||
|
|
||||
########################################################################### |
|
||||
# PYTHON |
|
||||
|
|
||||
if !defined(Class['python']) { |
|
||||
class { 'python': |
|
||||
version => 'system', |
|
||||
dev => true, |
|
||||
virtualenv => true, |
|
||||
pip => true, |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
$sigi_venv_dir = '/srv/.virtualenvs/sigi' |
|
||||
|
|
||||
file { ['/srv/.virtualenvs',]: |
|
||||
ensure => 'directory', |
|
||||
} |
|
||||
|
|
||||
python::virtualenv { $sigi_venv_dir : |
|
||||
require => File['/srv/.virtualenvs'], |
|
||||
} |
|
||||
|
|
||||
python::requirements { "${sigi_dir}/requirements/requirements.txt": |
|
||||
virtualenv => $sigi_venv_dir, |
|
||||
forceupdate => true, |
|
||||
require => [ |
|
||||
Python::Virtualenv[$sigi_venv_dir], |
|
||||
Vcsrepo[$sigi_dir], |
|
||||
Package[$package_deps] ] |
|
||||
} |
|
||||
|
|
||||
########################################################################### |
|
||||
# GERALDO (reporting) |
|
||||
file { "${sigi_venv_dir}/lib/python2.7/site-packages/reporting": |
|
||||
ensure => link, |
|
||||
target => "${sigi_venv_dir}/src/geraldo/reporting", |
|
||||
} |
|
||||
|
|
||||
########################################################################### |
|
||||
# DJANGO |
|
||||
|
|
||||
exec { 'collectstatic': |
|
||||
command => "${sigi_venv_dir}/bin/python manage.py collectstatic --noinput", |
|
||||
cwd => $sigi_dir, |
|
||||
require => [ |
|
||||
Python::Virtualenv[$sigi_venv_dir], |
|
||||
Vcsrepo[$sigi_dir], |
|
||||
Python::Requirements["${sigi_dir}/requirements/requirements.txt"], |
|
||||
] |
|
||||
} |
|
||||
|
|
||||
# TODO local_settings.py ... |
|
||||
|
|
||||
|
|
||||
########################################################################### |
|
||||
# SUPERVISOR |
|
||||
|
|
||||
# XXX trocar isso por algum plugin do puppet? |
|
||||
|
|
||||
$supervisor_conf = '/etc/supervisor/conf.d/sigi.conf' |
|
||||
|
|
||||
file { $supervisor_conf: |
|
||||
ensure => link, |
|
||||
target => "${sigi_dir}/etc/supervisor/conf.d/sigi.conf", |
|
||||
require => [ |
|
||||
Vcsrepo[$sigi_dir], |
|
||||
Package['supervisor'] ] |
|
||||
} |
|
||||
|
|
||||
exec { 'supervisor_update': |
|
||||
command => 'supervisorctl reread && supervisorctl update', |
|
||||
refreshonly => true, |
|
||||
subscribe => [ File[$supervisor_conf], Vcsrepo[$sigi_dir]], |
|
||||
} |
|
||||
|
|
||||
########################################################################### |
|
||||
# NGINX |
|
||||
|
|
||||
class { 'nginx': } |
|
||||
|
|
||||
nginx::resource::upstream { 'sigi_app_server': |
|
||||
members => [ 'unix:/var/run/sigi/sigi.sock' ], |
|
||||
upstream_fail_timeout => 0 |
|
||||
} |
|
||||
|
|
||||
# XXX trocar nome para server_name, p.ex. sigi01h.interlegis.leg.br |
|
||||
$sigi_vhost = 'localhost' |
|
||||
|
|
||||
nginx::resource::vhost { $sigi_vhost: |
|
||||
client_max_body_size => '4G', |
|
||||
access_log => '/var/log/sigi/sigi-access.log', |
|
||||
error_log => '/var/log/sigi/sigi-error.log', |
|
||||
use_default_location => false, |
|
||||
require => Vcsrepo[$sigi_dir], |
|
||||
|
|
||||
# TODO tentar usar try_files ao inves desse "if" |
|
||||
# vide http://stackoverflow.com/questions/19845566/in-nginxs-configuration-could-if-f-request-filename-cause-a-performan |
|
||||
# XXX este raw_append foi uma apelacao devido a limitacoes do modulo nginx |
|
||||
raw_append => ' |
|
||||
location / { |
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
|
||||
proxy_set_header Host $http_host; |
|
||||
proxy_redirect off; |
|
||||
if (!-f $request_filename) { |
|
||||
proxy_pass http://sigi_app_server; |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
' |
|
||||
} |
|
||||
|
|
||||
nginx::resource::location { '/static/': |
|
||||
vhost => $sigi_vhost, |
|
||||
location_alias => '/srv/sigi/static/', |
|
||||
} |
|
||||
|
|
||||
nginx::resource::location { '/media/': |
|
||||
vhost => $sigi_vhost, |
|
||||
location_alias => '/srv/sigi/media/', |
|
||||
} |
|
||||
|
|
||||
########################################################################### |
|
||||
# CRON |
|
||||
|
|
||||
cron { 'atualiza_uso_servico': |
|
||||
command => "${sigi_venv_dir}/bin/python ${sigi_dir}/manage.py atualiza_uso_servico -v 0", |
|
||||
user => 'sigi', |
|
||||
hour => [0,] |
|
||||
} |
|
||||
|
|
||||
cron { 'clearsessions': |
|
||||
command => "${sigi_venv_dir}/bin/python ${sigi_dir}/manage.py clearsessions -v 0", |
|
||||
user => 'sigi', |
|
||||
hour => [0,] |
|
||||
} |
|
||||
|
|
||||
cron { 'sync_ldap': |
|
||||
command => "${sigi_venv_dir}/bin/python ${sigi_dir}/manage.py sync_ldap", |
|
||||
user => 'sigi', |
|
||||
hour => [0,] |
|
||||
} |
|
||||
|
|
||||
cron { 'gera_map_data': |
|
||||
command => "${sigi_venv_dir}/bin/python ${sigi_dir}/manage.py gera_map_data", |
|
||||
user => 'sigi', |
|
||||
hour => "*/1", |
|
||||
} |
|
||||
|
|
||||
cron { 'get_moodle_stats': |
|
||||
command => "${sigi_venv_dir}/bin/python ${sigi_dir}/manage.py get_moodle_stats -v 0", |
|
||||
user => 'sigi', |
|
||||
hour => "*/1", |
|
||||
} |
|
@ -1,23 +0,0 @@ |
|||||
#!/bin/bash |
|
||||
# argumentos: <nome do modulo> <github_user/nome_repo> |
|
||||
|
|
||||
nome_modulo=$1 |
|
||||
github_path=$2 |
|
||||
nome_repo=$(echo $github_path | cut -d / -f 2) |
|
||||
|
|
||||
modulo_instalado=$( puppet module list | grep -ic $nome_modulo ) |
|
||||
|
|
||||
if [ $modulo_instalado -eq 0 ] |
|
||||
then |
|
||||
TAR_FILE="/tmp/$nome_modulo.tar.gz" |
|
||||
|
|
||||
wget "https://github.com/$github_path/archive/master.tar.gz" -O $TAR_FILE |
|
||||
rm -fr "/tmp/$nome_repo-master" |
|
||||
tar -C /tmp -xf $TAR_FILE |
|
||||
|
|
||||
echo "Building module $nome_modulo..." |
|
||||
TAR_MODULE=$(puppet module build "/tmp/$nome_repo-master" | grep 'Module built' | cut -d\ -f 3) |
|
||||
echo "Installing module $nome_modulo from " $TAR_MODULE ' ...' |
|
||||
puppet module install $TAR_MODULE |
|
||||
fi |
|
||||
|
|
@ -1,9 +0,0 @@ |
|||||
[pytest] |
|
||||
DJANGO_SETTINGS_MODULE=sigi.settings.test |
|
||||
|
|
||||
# REUSING DATABASE BY DEFAULT (as a performance optimization) |
|
||||
# http://pytest-django.readthedocs.org/en/latest/database.html#example-work-flow-with-reuse-db-and-create-db |
|
||||
# |
|
||||
# Run "py.test --create-db" if you need to recreate the database |
|
||||
# |
|
||||
addopts = --reuse-db |
|
@ -1,5 +1,3 @@ |
|||||
-r test-requirements.txt |
-r requirements.txt |
||||
django-debug-toolbar==1.2.2 |
pygraphviz==1.7 |
||||
ipdb==0.8 |
django-extensions==3.1.3 |
||||
ipython==2.3.1 |
|
||||
pygraphviz==1.2 |
|
||||
|
@ -1,7 +0,0 @@ |
|||||
Observações sobre as dependências: |
|
||||
|
|
||||
Produção: |
|
||||
* Geraldo: Eh importante usar "-e" pois precisamos do modulo reporting do fonte que nao eh instalado |
|
||||
|
|
||||
Desevenvolvimento: |
|
||||
* pygraphviz: para usar o comando "graph_models" do "django-extensions" |
|
@ -1,23 +1,4 @@ |
|||||
-e git://github.com/marinho/geraldo.git@868ebdce67176d9b6205cddc92476f642c783fff#egg=geraldo |
ipython==7.24.1 |
||||
django-bootstrap3==6.2.2 |
Django==3.2.4 |
||||
django-admin-bootstrapped==2.4.0 |
psycopg2==2.8.6 |
||||
django-auth-ldap==1.2.7 |
django-bootstrap5==2.0.1 |
||||
django-autoslug==1.9.3 |
|
||||
django-extensions==1.5.7 |
|
||||
django-image-cropping==1.0.2 |
|
||||
django-localflavor==1.1 |
|
||||
Django==1.7.10 |
|
||||
easy-thumbnails==2.2 |
|
||||
eav-django==1.4.7 |
|
||||
gunicorn==19.3.0 |
|
||||
html5lib==0.9999999 |
|
||||
Pillow==2.9.0 |
|
||||
pisa==3.0.33 |
|
||||
psycopg2==2.6.1 |
|
||||
python-memcached==1.53 |
|
||||
PyYAML==3.11 |
|
||||
reportlab==2.7 |
|
||||
requests==2.8.1 |
|
||||
six==1.10.0 |
|
||||
djangorestframework==2.4.8 |
|
||||
django-ipware==1.1.6 |
|
||||
|
@ -1,10 +0,0 @@ |
|||||
-r requirements.txt |
|
||||
coverage==3.7.1 |
|
||||
django-dynamic-fixture==1.8.1 |
|
||||
django-webtest==1.7.7 |
|
||||
pyPdf==1.13 |
|
||||
pyquery==1.2.9 |
|
||||
pytest-cov==1.8.1 |
|
||||
pytest-django==2.8.0 |
|
||||
pytest==2.6.4 |
|
||||
WebTest==2.0.17 |
|
@ -1,8 +0,0 @@ |
|||||
# py.test precisa deste arquivo para que o projeto seja instalado no virtualenv com: |
|
||||
# "pip install -e ." |
|
||||
# vide http://pytest-django.readthedocs.org/en/latest/faq.html#i-see-an-error-saying-could-not-import-myproject-settings |
|
||||
# |
|
||||
from distutils.core import setup |
|
||||
|
|
||||
|
|
||||
setup(name='sigi', version='2.x') |
|
@ -1,100 +1,96 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
# |
|
||||
# sigi.apps.contatos.management.commands.importa_mesomicro |
|
||||
# |
|
||||
# Copyright (c) 2015 by Interlegis |
|
||||
# |
|
||||
# GNU General Public License (GPL) |
|
||||
# |
|
||||
# This program is free software; you can redistribute it and/or |
|
||||
# modify it under the terms of the GNU General Public License |
|
||||
# as published by the Free Software Foundation; either version 2 |
|
||||
# of the License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU General Public License |
|
||||
# along with this program; if not, write to the Free Software |
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
|
||||
# 02110-1301, USA. |
|
||||
# |
|
||||
import csv |
import csv |
||||
import os |
import os |
||||
from django.core.management.base import BaseCommand, CommandError |
from django.core.management.base import BaseCommand, CommandError, CommandParser |
||||
from sigi.apps.contatos.models import Municipio, UnidadeFederativa, Mesorregiao, Microrregiao |
from sigi.apps.contatos.models import (Municipio, UnidadeFederativa, |
||||
|
Mesorregiao, Microrregiao) |
||||
|
|
||||
class Command(BaseCommand): |
class Command(BaseCommand): |
||||
args = u"data_file.csv" |
help = """ |
||||
help = u"""Importa arquivo do IBGE para preencher as tabelas de meso e microrregiões para os municípios. |
Importa arquivo do IBGE para preencher as tabelas de meso e microrregiões para |
||||
|
os municípios. A primeira linha do arquivo deve possuir um cabeçalho com os |
||||
A primeira linha do arquivo deve possuir um cabeçalho com os seguintes campos obrigatórios: |
seguintes campos obrigatórios (Os nomes dos campos devem ser grafados exatamente |
||||
- cod_uf : Código IBGE da Unidade da Federação |
como descrito): |
||||
- cod_mesorregiao : Código IBGE da mesorregião |
"cod_uf" (Código IBGE da Unidade da Federação), |
||||
- nome_mesorregiao : Nome da mesorregião |
"cod_mesorregiao" (Código IBGE da mesorregião), |
||||
- cod_microrregiao : Código IBGE da microrregião |
"nome_mesorregiao" (Nome da mesorregião), |
||||
- nome_microrregiao : Nome da microrregião |
"cod_microrregiao" (Código IBGE da microrregião), |
||||
- cod_municipio : Código IBGE do município |
"nome_microrregiao" (Nome da microrregião), |
||||
|
"cod_municipio" (Código IBGE do município\n) |
||||
* Os nomes dos campos devem ser grafados exatamente como descrito.""" |
""" |
||||
|
|
||||
campos = {'cod_uf', 'cod_mesorregiao', 'nome_mesorregiao', 'cod_microrregiao', |
campos = {'cod_uf', 'cod_mesorregiao', 'nome_mesorregiao', |
||||
'nome_microrregiao', 'cod_municipio'} |
'cod_microrregiao', 'nome_microrregiao', 'cod_municipio'} |
||||
|
|
||||
|
def add_arguments(self, parser: CommandParser) -> None: |
||||
|
parser.add_argument('file_name', type=str, |
||||
|
help="Arquivo CSV a ser importado") |
||||
|
|
||||
def handle(self, *args, **options): |
def handle(self, *args, **options): |
||||
if len(args) != 1: |
file_name = options['file_name'] |
||||
raise CommandError(u"Informe UM arquivo csv a importar") |
|
||||
|
|
||||
file_name = args[0] |
|
||||
|
|
||||
if not os.path.isfile(file_name): |
if not os.path.isfile(file_name): |
||||
raise CommandError(u"Arquivo %s não encontrado" % [file_name,]) |
raise CommandError("Arquivo %s não encontrado" % file_name) |
||||
|
|
||||
with open(file_name, 'rb') as csvfile: |
with open(file_name, 'rt') as csvfile: |
||||
reader = csv.DictReader(csvfile) |
reader = csv.DictReader(csvfile) |
||||
|
|
||||
if not self.campos.issubset(reader.fieldnames): |
if not self.campos.issubset(reader.fieldnames): |
||||
raise CommandError(u"O arquivo não possui todos os campos obrigatórios") |
raise CommandError( |
||||
|
"O arquivo não possui todos os campos obrigatórios" |
||||
|
) |
||||
|
|
||||
erros = 0 |
erros = 0 |
||||
|
|
||||
for reg in reader: |
for reg in reader: |
||||
try: |
try: |
||||
uf = UnidadeFederativa.objects.get(codigo_ibge=reg['cod_uf']) |
uf = UnidadeFederativa.objects.get( |
||||
|
codigo_ibge=reg['cod_uf'] |
||||
|
) |
||||
except UnidadeFederativa.DoesNotExist: |
except UnidadeFederativa.DoesNotExist: |
||||
self.stdout.write(u"(Linha %s): não existe UF com código IBGE '%s'" % |
self.stdout.write(self.style.ERROR( |
||||
(reader.line_num, reg['cod_uf'],)) |
"(Linha %s): não existe UF com código IBGE '%s'" % |
||||
|
(reader.line_num, reg['cod_uf']) |
||||
|
)) |
||||
erros = erros + 1 |
erros = erros + 1 |
||||
continue |
continue |
||||
|
|
||||
try: |
try: |
||||
municipio = Municipio.objects.get(codigo_ibge=reg['cod_municipio']) |
municipio = Municipio.objects.get( |
||||
|
codigo_ibge=reg['cod_municipio'] |
||||
|
) |
||||
except Municipio.DoesNotExist: |
except Municipio.DoesNotExist: |
||||
self.stdout.write(u"(Linha %s): não existe Município com código IBGE '%s'" % |
self.stdout.write(self.style.ERROR( |
||||
(reader.line_num, reg['cod_municipio'],)) |
"(Linha %s): não existe Município com código IBGE '%s'" |
||||
|
% (reader.line_num, reg['cod_municipio']) |
||||
|
)) |
||||
erros = erros + 1 |
erros = erros + 1 |
||||
continue |
continue |
||||
|
|
||||
cod_meso = reg['cod_uf'] + reg['cod_mesorregiao'] |
cod_meso = reg['cod_uf'] + reg['cod_mesorregiao'] |
||||
cod_micro = cod_meso + reg['cod_microrregiao'] |
cod_micro = cod_meso + reg['cod_microrregiao'] |
||||
|
|
||||
if Mesorregiao.objects.filter(codigo_ibge=cod_meso).exists(): |
meso, _ = Mesorregiao.objects.get_or_create( |
||||
meso = Mesorregiao.objects.get(codigo_ibge=cod_meso) |
codigo_ibge=cod_meso, |
||||
else: |
defaults={ |
||||
meso = Mesorregiao(codigo_ibge=cod_meso, uf=uf, nome=reg['nome_mesorregiao']) |
'uf': uf, |
||||
meso.nome = reg['nome_mesorregiao'] |
'nome': reg['nome_mesorregiao'] |
||||
|
} |
||||
|
) |
||||
meso.save() |
meso.save() |
||||
|
|
||||
if Microrregiao.objects.filter(codigo_ibge=cod_micro).exists(): |
micro, _ = Microrregiao.objects.get_or_create( |
||||
micro = Microrregiao.objects.get(codigo_ibge=cod_micro) |
codigo_ibge=cod_micro, |
||||
else: |
defaults={ |
||||
micro = Microrregiao(codigo_ibge=cod_micro, mesorregiao=meso, nome=reg['nome_microrregiao']) |
'mesorregiao': meso, |
||||
micro.nome = reg['nome_microrregiao'] |
'nome': reg['nome_microrregiao'] |
||||
|
} |
||||
|
) |
||||
micro.save() |
micro.save() |
||||
|
|
||||
municipio.microrregiao = micro |
municipio.microrregiao = micro |
||||
municipio.save() |
municipio.save() |
||||
|
|
||||
self.stdout.write(u"Importação concluída. %s erros em %s linhas" % (erros, reader.line_num,)) |
self.stdout.write(self.style.NOTICE( |
||||
|
"Importação concluída. %s erros em %s linhas" % |
||||
|
(erros, reader.line_num) |
||||
|
)) |
@ -1,31 +1,191 @@ |
|||||
# coding: utf-8 |
# coding: utf-8 |
||||
import string |
import string |
||||
|
from django.utils.translation import gettext as _ |
||||
from django.contrib import admin |
from django.contrib import admin |
||||
|
from django.contrib.admin.utils import reverse_field_path |
||||
|
|
||||
|
class RangeFieldListFilter(admin.FieldListFilter): |
||||
|
slices = 5 |
||||
|
def __init__(self, field, request, params, model, model_admin, field_path): |
||||
|
self.lookup_kwarg_gte = '%s__gte' % field_path |
||||
|
self.lookup_kwarg_lt = '%s__lt' % field_path |
||||
|
self.lookup_kwarg_isnull = '%s__isnull' % field_path |
||||
|
self.lookup_val_gte = params.get(self.lookup_kwarg_gte) |
||||
|
self.lookup_val_lt = params.get(self.lookup_kwarg_lt) |
||||
|
self.lookup_val_isnull = params.get(self.lookup_kwarg_isnull) |
||||
|
self.empty_value_display = model_admin.get_empty_value_display() |
||||
|
parent_model, reverse_path = reverse_field_path(model, field_path) |
||||
|
# Obey parent ModelAdmin queryset when deciding which options to show |
||||
|
if model == parent_model: |
||||
|
queryset = model_admin.get_queryset(request) |
||||
|
else: |
||||
|
queryset = parent_model._default_manager.all() |
||||
|
self.lookup_choices = self.slice_range(queryset.order_by(field.name) |
||||
|
.values_list(field.name, flat=True)) |
||||
|
super().__init__(field, request, params, model, model_admin, field_path) |
||||
|
|
||||
class AlphabeticFilter(admin.SimpleListFilter): |
def expected_parameters(self): |
||||
# Human-readable title which will be displayed in the |
return [self.lookup_kwarg_gte, self.lookup_kwarg_lt, |
||||
# right admin sidebar just above the filter options. |
self.lookup_kwarg_isnull] |
||||
title = '' |
|
||||
|
def choices(self, changelist): |
||||
# Parameter for the filter that will be used in the URL query. |
yield { |
||||
parameter_name = '' |
'selected': (self.lookup_val_gte is None and |
||||
|
self.lookup_val_lt is None and |
||||
def lookups(self, request, model_admin): |
self.lookup_val_isnull is None), |
||||
""" |
'query_string': changelist.get_query_string(remove=[ |
||||
Returns a list of tuples. The first element in each |
self.lookup_kwarg_gte, self.lookup_kwarg_lt, |
||||
tuple is the coded value for the option that will |
self.lookup_kwarg_isnull]), |
||||
appear in the URL query. The second element is the |
'display': _('All'), |
||||
human-readable name for the option that will appear |
} |
||||
in the right sidebar. |
last_val = None |
||||
""" |
for val in self.lookup_choices: |
||||
return ((letter, letter,) for letter in string.ascii_uppercase) |
val = str(val) |
||||
|
if last_val is None: |
||||
def queryset(self, request, queryset): |
last_val = val |
||||
""" |
yield { |
||||
Returns the filtered queryset based on the value |
'selected': self.lookup_val_lt == val, |
||||
provided in the query string and retrievable via |
'query_string': changelist.get_query_string( |
||||
`self.value()`. |
{self.lookup_kwarg_lt: val}, |
||||
""" |
[self.lookup_kwarg_isnull, self.lookup_kwarg_gte]), |
||||
if self.value(): |
'display': _('Menor que %s') % val, |
||||
return queryset.filter((self.parameter_name + '__istartswith', self.value())) |
} |
||||
|
else: |
||||
|
yield { |
||||
|
'selected': (self.lookup_val_gte == last_val and |
||||
|
self.lookup_val_lt == val), |
||||
|
'query_string': changelist.get_query_string( |
||||
|
{self.lookup_kwarg_gte: last_val, |
||||
|
self.lookup_kwarg_lt: val}, |
||||
|
[self.lookup_kwarg_isnull]), |
||||
|
'display': _("De %s até %s") % (last_val, val), |
||||
|
} |
||||
|
last_val = val |
||||
|
|
||||
|
yield { |
||||
|
'selected': self.lookup_val_gte == last_val, |
||||
|
'query_string': changelist.get_query_string( |
||||
|
{self.lookup_kwarg_gte: last_val}, |
||||
|
[self.lookup_kwarg_isnull, self.lookup_kwarg_lt]), |
||||
|
'display': _("De %s acima") % last_val, |
||||
|
} |
||||
|
|
||||
|
def slice_range(self, queryset): |
||||
|
if queryset.distinct().count() < self.slices: |
||||
|
return list(queryset.distinct()) |
||||
|
|
||||
|
total = queryset.count() |
||||
|
salt = total // self.slices |
||||
|
result = [] |
||||
|
|
||||
|
for pos in range(salt, salt*self.slices, salt): |
||||
|
result.append(queryset[pos]) |
||||
|
|
||||
|
return result |
||||
|
|
||||
|
class MultiRelatedFieldListFilter(admin.RelatedFieldListFilter): |
||||
|
template = "admin/multifilter.html" |
||||
|
def __init__(self, field, request, params, model, model_admin, field_path): |
||||
|
super().__init__(field, request, params, model, model_admin, field_path) |
||||
|
self.lookup_kwarg = '%s__%s__in' % (field_path, field.target_field.name) |
||||
|
self.lookup_kwarg_isnull = '%s__isnull' % field_path |
||||
|
self.lookup_val = params.get(self.lookup_kwarg) |
||||
|
|
||||
|
def expected_parameters(self): |
||||
|
return [self.lookup_kwarg, self.lookup_kwarg_isnull] |
||||
|
|
||||
|
def choices(self, changelist): |
||||
|
yield { |
||||
|
'selected': self.lookup_val is None and not self.lookup_val_isnull, |
||||
|
'query_string': changelist.get_query_string( |
||||
|
remove=[self.lookup_kwarg, self.lookup_kwarg_isnull] |
||||
|
), |
||||
|
'display': _('All'), |
||||
|
} |
||||
|
for pk_val, val in self.lookup_choices: |
||||
|
values = (set(self.lookup_val.split(',')) if self.lookup_val |
||||
|
else set()) |
||||
|
selected = str(pk_val) in values |
||||
|
if selected: |
||||
|
values.discard(str(pk_val)) |
||||
|
else: |
||||
|
values.add(str(pk_val)) |
||||
|
|
||||
|
if values: |
||||
|
yield { |
||||
|
'selected': selected, |
||||
|
'query_string': changelist.get_query_string( |
||||
|
{self.lookup_kwarg: ",".join(values)}, |
||||
|
[self.lookup_kwarg_isnull]), |
||||
|
'display': val, |
||||
|
} |
||||
|
else: |
||||
|
yield { |
||||
|
'selected': selected, |
||||
|
'query_string': changelist.get_query_string( |
||||
|
remove=[self.lookup_kwarg, self.lookup_kwarg_isnull]), |
||||
|
'display': val, |
||||
|
} |
||||
|
|
||||
|
if self.include_empty_choice: |
||||
|
yield { |
||||
|
'selected': bool(self.lookup_val_isnull), |
||||
|
'query_string': changelist.get_query_string( |
||||
|
{self.lookup_kwarg_isnull: 'True'}, [self.lookup_kwarg] |
||||
|
), |
||||
|
'display': self.empty_value_display, |
||||
|
} |
||||
|
|
||||
|
class MultiChoicesFieldListFilter(admin.ChoicesFieldListFilter): |
||||
|
template = "admin/multifilter.html" |
||||
|
def __init__(self, field, request, params, model, model_admin, field_path): |
||||
|
super().__init__(field, request, params, model, model_admin, field_path) |
||||
|
self.lookup_kwarg = '%s__in' % field_path |
||||
|
self.lookup_val = params.get(self.lookup_kwarg) |
||||
|
|
||||
|
def choices(self, changelist): |
||||
|
yield { |
||||
|
'selected': self.lookup_val is None, |
||||
|
'query_string': changelist.get_query_string( |
||||
|
remove=[self.lookup_kwarg, self.lookup_kwarg_isnull] |
||||
|
), |
||||
|
'display': _('All') |
||||
|
} |
||||
|
none_title = '' |
||||
|
for lookup, title in self.field.flatchoices: |
||||
|
values = (set(self.lookup_val.split(',')) if self.lookup_val |
||||
|
else set()) |
||||
|
selected = str(lookup) in values |
||||
|
if selected: |
||||
|
values.discard(str(lookup)) |
||||
|
else: |
||||
|
values.add(str(lookup)) |
||||
|
|
||||
|
if lookup is None: |
||||
|
none_title = title |
||||
|
continue |
||||
|
|
||||
|
if values: |
||||
|
yield { |
||||
|
'selected': selected, |
||||
|
'query_string': changelist.get_query_string( |
||||
|
{self.lookup_kwarg: ",".join(values)}, |
||||
|
[self.lookup_kwarg_isnull]), |
||||
|
'display': title, |
||||
|
} |
||||
|
else: |
||||
|
yield { |
||||
|
'selected': selected, |
||||
|
'query_string': changelist.get_query_string( |
||||
|
remove=[self.lookup_kwarg, self.lookup_kwarg_isnull]), |
||||
|
'display': title, |
||||
|
} |
||||
|
|
||||
|
if none_title: |
||||
|
yield { |
||||
|
'selected': bool(self.lookup_val_isnull), |
||||
|
'query_string': changelist.get_query_string( |
||||
|
{self.lookup_kwarg_isnull: 'True'}, [self.lookup_kwarg] |
||||
|
), |
||||
|
'display': none_title, |
||||
|
} |
@ -1,190 +1,126 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
""" |
""" |
||||
Django settings for sigi project. |
Django settings for sigi project. |
||||
|
Generated by 'django-admin startproject' using Django 3.2.4. |
||||
For more information on this file, see |
|
||||
https://docs.djangoproject.com/en/dev/topics/settings/ |
|
||||
|
|
||||
For the full list of settings and their values, see |
|
||||
https://docs.djangoproject.com/en/dev/ref/settings/ |
|
||||
""" |
""" |
||||
|
|
||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) |
from pathlib import Path |
||||
import os |
|
||||
from os.path import dirname |
|
||||
|
|
||||
import django.conf.global_settings as DEFAULT_SETTINGS |
|
||||
|
|
||||
BASE_DIR = dirname(dirname(dirname(__file__))) |
BASE_DIR = Path(__file__).resolve().parent.parent.parent |
||||
|
|
||||
# Quick-start development settings - unsuitable for production |
# Security settings |
||||
# See https://docs.djangoproject.com/en/dev/howto/deployment/checklist/ |
|
||||
|
|
||||
|
SECRET_KEY = 'django-insecure-7-gj3=#0f5sbwac6k$_rws5-47kze&-vtq=yt=2x9e%)27x%5g' |
||||
|
DEBUG = True |
||||
ALLOWED_HOSTS = [] |
ALLOWED_HOSTS = [] |
||||
|
|
||||
ADMINS = ( |
|
||||
# ('Your Name', 'your_email@example.com'), |
|
||||
) |
|
||||
|
|
||||
MANAGERS = ADMINS |
|
||||
|
|
||||
SITE_ID = 1 |
|
||||
|
|
||||
TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_SETTINGS.TEMPLATE_CONTEXT_PROCESSORS + ( |
|
||||
'django.core.context_processors.request', |
|
||||
) |
|
||||
# List of callables that know how to import templates from various sources. |
|
||||
TEMPLATE_LOADERS = ('django.template.loaders.filesystem.Loader', |
|
||||
'django.template.loaders.app_directories.Loader', |
|
||||
) |
|
||||
|
|
||||
# Application definition |
# Application definition |
||||
INSTALLED_APPS = ( |
|
||||
|
|
||||
'bootstrap3', |
|
||||
'django_admin_bootstrapped', |
|
||||
|
|
||||
|
INSTALLED_APPS = [ |
||||
|
'django_bootstrap5', |
||||
'django.contrib.admin', |
'django.contrib.admin', |
||||
'django.contrib.auth', |
'django.contrib.auth', |
||||
'django.contrib.contenttypes', |
'django.contrib.contenttypes', |
||||
'django.contrib.sessions', |
'django.contrib.sessions', |
||||
'django.contrib.messages', |
'django.contrib.messages', |
||||
'django.contrib.staticfiles', |
'django.contrib.staticfiles', |
||||
|
'sigi.apps.utils', |
||||
# Local apps |
# 'sigi.apps.home', |
||||
'sigi.apps.home', |
|
||||
'sigi.apps.contatos', |
'sigi.apps.contatos', |
||||
'sigi.apps.servidores', |
# 'sigi.apps.servidores', |
||||
'sigi.apps.parlamentares', |
# 'sigi.apps.parlamentares', |
||||
'sigi.apps.casas', |
# 'sigi.apps.casas', |
||||
'sigi.apps.convenios', |
# 'sigi.apps.convenios', |
||||
'sigi.apps.inventario', |
# 'sigi.apps.inventario', |
||||
'sigi.apps.servicos', |
# 'sigi.apps.servicos', |
||||
'sigi.apps.metas', |
# 'sigi.apps.metas', |
||||
'sigi.apps.ocorrencias', |
# 'sigi.apps.ocorrencias', |
||||
'sigi.apps.financeiro', |
# 'sigi.apps.financeiro', |
||||
'sigi.apps.diagnosticos', |
# 'sigi.apps.diagnosticos', |
||||
'sigi.apps.eventos', |
# 'sigi.apps.eventos', |
||||
'sigi.apps.whois', |
# 'sigi.apps.whois', |
||||
|
|
||||
# Third-party apps |
|
||||
'localflavor', |
|
||||
'reporting', |
|
||||
'django_extensions', |
'django_extensions', |
||||
'easy_thumbnails', |
] |
||||
'image_cropping', |
MIDDLEWARE = [ |
||||
'rest_framework', |
'django.middleware.security.SecurityMiddleware', |
||||
|
|
||||
) |
|
||||
|
|
||||
MIDDLEWARE_CLASSES = ( |
|
||||
'django.contrib.sessions.middleware.SessionMiddleware', |
'django.contrib.sessions.middleware.SessionMiddleware', |
||||
'django.middleware.common.CommonMiddleware', |
'django.middleware.common.CommonMiddleware', |
||||
'django.middleware.csrf.CsrfViewMiddleware', |
'django.middleware.csrf.CsrfViewMiddleware', |
||||
'django.contrib.auth.middleware.AuthenticationMiddleware', |
'django.contrib.auth.middleware.AuthenticationMiddleware', |
||||
'django.contrib.messages.middleware.MessageMiddleware', |
'django.contrib.messages.middleware.MessageMiddleware', |
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware', |
'django.middleware.clickjacking.XFrameOptionsMiddleware', |
||||
) |
] |
||||
|
|
||||
ROOT_URLCONF = 'sigi.urls' |
ROOT_URLCONF = 'sigi.urls' |
||||
|
TEMPLATES = [ |
||||
|
{ |
||||
|
'BACKEND': 'django.template.backends.django.DjangoTemplates', |
||||
|
'DIRS': [BASE_DIR / "templates",], |
||||
|
'APP_DIRS': True, |
||||
|
'OPTIONS': { |
||||
|
'context_processors': [ |
||||
|
'django.template.context_processors.debug', |
||||
|
'django.template.context_processors.request', |
||||
|
'django.contrib.auth.context_processors.auth', |
||||
|
'django.contrib.messages.context_processors.messages', |
||||
|
], |
||||
|
}, |
||||
|
}, |
||||
|
] |
||||
WSGI_APPLICATION = 'sigi.wsgi.application' |
WSGI_APPLICATION = 'sigi.wsgi.application' |
||||
|
|
||||
|
# Database |
||||
|
|
||||
|
DATABASES = { |
||||
|
'default': { |
||||
|
'ENGINE': 'django.db.backends.postgresql_psycopg2', |
||||
|
'NAME': 'sigi', |
||||
|
'USER': 'sigi', |
||||
|
'PASSWORD': '123456', |
||||
|
'HOST': 'localhost', |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
# Password validation |
||||
|
|
||||
|
AUTH_PASSWORD_VALIDATORS = [ |
||||
|
{ |
||||
|
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', |
||||
|
}, |
||||
|
{ |
||||
|
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', |
||||
|
}, |
||||
|
{ |
||||
|
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', |
||||
|
}, |
||||
|
{ |
||||
|
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', |
||||
|
}, |
||||
|
] |
||||
|
|
||||
# Internationalization |
# Internationalization |
||||
# https://docs.djangoproject.com/en/dev/topics/i18n/ |
|
||||
LANGUAGE_CODE = 'pt-br' |
LANGUAGE_CODE = 'pt-br' |
||||
|
TIME_ZONE = 'UTC' |
||||
USE_I18N = True |
USE_I18N = True |
||||
USE_L10N = True |
USE_L10N = True |
||||
|
USE_TZ = True |
||||
USE_THOUSAND_SEPARATOR = True |
USE_THOUSAND_SEPARATOR = True |
||||
|
|
||||
gettext_noop = lambda s: s # for gettext discovery |
|
||||
LANGUAGES = ( |
|
||||
('en', gettext_noop('English')), |
|
||||
('pt-br', gettext_noop('Brazilian Portuguese')), |
|
||||
) |
|
||||
|
|
||||
# Static files (CSS, JavaScript, Images) |
# Static files (CSS, JavaScript, Images) |
||||
# https://docs.djangoproject.com/en/dev/howto/static-files/ |
|
||||
STATIC_ROOT = os.path.join(BASE_DIR, 'static') |
|
||||
STATIC_URL = '/static/' |
|
||||
STATICFILES_DIRS = ( |
|
||||
os.path.join(BASE_DIR, 'sigiStatic'), |
|
||||
) |
|
||||
|
|
||||
SERVER_EMAIL = 'sigi@interlegis.leg.br' |
|
||||
DEFAULT_FROM_EMAIL = 'spdt@interlegis.leg.br' |
|
||||
EMAIL_SUBJECT_PREFIX = u'[SIGI]' |
|
||||
|
|
||||
TEMPLATE_DIRS = ( |
|
||||
os.path.join(BASE_DIR, 'templates'), |
|
||||
) |
|
||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') |
|
||||
MEDIA_URL = '/media/' |
|
||||
|
|
||||
SESSION_EXPIRE_AT_BROWSER_CLOSE = True |
|
||||
|
|
||||
LOGIN_REDIRECT_URL = '/' |
STATIC_ROOT = BASE_DIR / 'static' |
||||
LOGIN_URL = '/login/' |
STATIC_URL = '/static/' |
||||
|
STATICFILES_DIRS = (BASE_DIR / 'sigiStatic', ) |
||||
|
|
||||
# Using pytest directly (without a test runner) |
# Media files (uploaded by user) |
||||
TEST_RUNNER = None |
|
||||
|
|
||||
from easy_thumbnails.conf import Settings as thumbnail_settings |
MEDIA_ROOT = BASE_DIR / 'media' |
||||
THUMBNAIL_PROCESSORS = ( |
MEDIA_URL = '/media/' |
||||
'image_cropping.thumbnail_processors.crop_corners', |
|
||||
) + thumbnail_settings.THUMBNAIL_PROCESSORS |
|
||||
|
|
||||
THUMBNAIL_ALIASES = { |
# Default primary key field type |
||||
'': { |
|
||||
'small': {'size': (300, 225), 'crop': True, }, |
|
||||
'thumb': {'size': (160, 120), 'crop': True, }, |
|
||||
'portrait': {'size': (73,100), 'crop': True}, |
|
||||
'icon': {'size': (36,50), 'crop': True}, |
|
||||
}, |
|
||||
} |
|
||||
IMAGE_CROPPING_SIZE_WARNING = True |
|
||||
IMAGE_CROPPING_THUMB_SIZE = (800, 600) |
|
||||
|
|
||||
LOGGING = { |
|
||||
'version': 1, |
|
||||
'disable_existing_loggers': False, |
|
||||
'filters': { |
|
||||
'require_debug_false': { |
|
||||
'()': 'django.utils.log.RequireDebugFalse' |
|
||||
} |
|
||||
}, |
|
||||
'handlers': { |
|
||||
'mail_admins': { |
|
||||
'level': 'ERROR', |
|
||||
'class': 'django.utils.log.AdminEmailHandler', |
|
||||
'include_html': True, |
|
||||
'filters': ['require_debug_false'], |
|
||||
}, |
|
||||
'file': { |
|
||||
'level': 'DEBUG', |
|
||||
'class': 'logging.FileHandler', |
|
||||
'filename': '/var/log/sigi/application.log', |
|
||||
}, |
|
||||
}, |
|
||||
'loggers': { |
|
||||
'django.request': { |
|
||||
'handlers': ['mail_admins', 'file'], |
|
||||
'level': 'ERROR', |
|
||||
'propagate': True, |
|
||||
}, |
|
||||
}, |
|
||||
} |
|
||||
|
|
||||
OSTICKET_URL = 'https://suporte.interlegis.leg.br/scp/tickets.php?a=search&query=%s' |
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' |
||||
|
|
||||
REST_FRAMEWORK = { |
# Admin interface |
||||
# Use Django's standard `django.contrib.auth` permissions, |
|
||||
# or allow read-only access for unauthenticated users. |
|
||||
'DEFAULT_PERMISSION_CLASSES': [ |
|
||||
'rest_framework.permissions.AllowAny', |
|
||||
] |
|
||||
} |
|
||||
|
|
||||
# Lista de endereços IP que podem acessar a API de whois |
X_FRAME_OPTIONS='SAMEORIGIN' |
||||
WHOIS_WHITELIST = [ |
SILENCED_SYSTEM_CHECKS = ['security.W019'] |
||||
'127.0.0.1', |
|
||||
] |
|
@ -1,31 +1,11 @@ |
|||||
from base import * |
from sigi.settings.base import * |
||||
|
|
||||
# SECURITY WARNING: keep the secret key used in production secret! |
|
||||
SECRET_KEY = '0$ip1fb5xtq%a=)-k_4r^(#jn0t^@+*^kihkxkozg-mip7+w3+' |
|
||||
|
|
||||
DATABASES = { |
DATABASES = { |
||||
'default': { |
'default': { |
||||
'ENGINE': 'django.db.backends.postgresql_psycopg2', |
'ENGINE': 'django.db.backends.postgresql_psycopg2', |
||||
'NAME': 'sigi', |
'NAME': 'sigi-3', |
||||
'USER': 'sigi', |
'USER': 'sigi', |
||||
'PASSWORD': 'sigi', |
'PASSWORD': '123456', |
||||
'HOST': 'localhost', |
'HOST': 'database', |
||||
}, |
}, |
||||
} |
} |
||||
|
|
||||
# SECURITY WARNING: don't run with debug turned on in production! |
|
||||
DEBUG = True |
|
||||
TEMPLATE_DEBUG = DEBUG |
|
||||
DEBUG_TOOLBAR_CONFIG = { |
|
||||
'SHOW_TEMPLATE_CONTEXT': True, |
|
||||
} |
|
||||
|
|
||||
INSTALLED_APPS += ( |
|
||||
'debug_toolbar', |
|
||||
) |
|
||||
|
|
||||
CACHES = { |
|
||||
'default': { |
|
||||
'BACKEND': 'django.core.cache.backends.dummy.DummyCache', |
|
||||
} |
|
||||
} |
|
@ -1,41 +1,30 @@ |
|||||
#-*- coding:utf-8 -*- |
"""sigi URL Configuration |
||||
|
|
||||
|
The `urlpatterns` list routes URLs to views. For more information please see: |
||||
|
https://docs.djangoproject.com/en/3.2/topics/http/urls/ |
||||
|
Examples: |
||||
|
Function views |
||||
|
1. Add an import: from my_app import views |
||||
|
2. Add a URL to urlpatterns: path('', views.home, name='home') |
||||
|
Class-based views |
||||
|
1. Add an import: from other_app.views import Home |
||||
|
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') |
||||
|
Including another URLconf |
||||
|
1. Import the include() function: from django.urls import include, path |
||||
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) |
||||
|
""" |
||||
from django.conf import settings |
from django.conf import settings |
||||
from django.conf.urls import patterns, include, url |
|
||||
from django.conf.urls.static import static |
|
||||
from django.contrib import admin |
from django.contrib import admin |
||||
from django.views.generic.base import TemplateView |
from django.views.static import serve |
||||
|
from django.urls import path |
||||
admin.site.index_template = 'index.html' |
|
||||
admin.autodiscover() |
|
||||
|
|
||||
urlpatterns = patterns( |
|
||||
'', |
|
||||
|
|
||||
url(r'^parlamentares/', include('sigi.apps.parlamentares.urls')), |
urlpatterns = [ |
||||
url(r'^casas/', include('sigi.apps.casas.urls')), |
path('admin/', admin.site.urls), |
||||
url(r'^convenios/', include('sigi.apps.convenios.urls')), |
] |
||||
url(r'^diagnosticos/', include('sigi.apps.diagnosticos.urls')), |
|
||||
url(r'^servicos/', include('sigi.apps.servicos.urls')), |
|
||||
url(r'^dashboard/', include('sigi.apps.metas.urls')), |
|
||||
url(r'^ocorrencias/', include('sigi.apps.ocorrencias.urls')), |
|
||||
url(r'^eventos/', include('sigi.apps.eventos.urls')), |
|
||||
url(r'^whois/', include('sigi.apps.whois.urls')), |
|
||||
url(r'^', include('sigi.apps.home.urls')), |
|
||||
url(r'^', include(admin.site.urls)), |
|
||||
|
|
||||
# to enable language selection |
|
||||
# Suspended |
|
||||
#url(r'^i18n/', include('django.conf.urls.i18n')), |
|
||||
|
|
||||
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) |
|
||||
|
|
||||
if settings.DEBUG: |
if settings.DEBUG: |
||||
urlpatterns = patterns( |
urlpatterns += [ |
||||
'', |
path('media/<path:path>/', serve, { |
||||
|
'document_root': settings.MEDIA_ROOT, |
||||
url(r'^404/$', TemplateView.as_view(template_name='404.html')), |
}), |
||||
url(r'^500/$', TemplateView.as_view(template_name='500.html')), |
] |
||||
url(r'^503/$', TemplateView.as_view(template_name='503.html')), |
|
||||
url(r'^media/(?P<path>.*)$', 'django.views.static.serve', { |
|
||||
'document_root': settings.MEDIA_ROOT, }), |
|
||||
) + urlpatterns |
|
@ -1,12 +0,0 @@ |
|||||
{% extends "admin/base_site.html" %} |
|
||||
{% load i18n %} |
|
||||
|
|
||||
{% block title %}{% trans 'Page not found' %}{% endblock %} |
|
||||
|
|
||||
{% block content %} |
|
||||
|
|
||||
<h2>{% trans 'Page not found' %}</h2> |
|
||||
|
|
||||
<p>{% trans "We're sorry, but the requested page could not be found." %}</p> |
|
||||
|
|
||||
{% endblock %} |
|
@ -1,12 +0,0 @@ |
|||||
{% extends "admin/base_site.html" %} |
|
||||
{% load i18n %} |
|
||||
|
|
||||
{% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans "Home" %}</a> › {% trans "Server error" %}</div>{% endblock %} |
|
||||
|
|
||||
{% block title %}{% trans 'Server error (500)' %}{% endblock %} |
|
||||
|
|
||||
{% block content %} |
|
||||
<h1>{% trans 'Server Error <em>(500)</em>' %}</h1> |
|
||||
<p>{% trans "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience." %}</p> |
|
||||
|
|
||||
{% endblock %} |
|
@ -1,19 +0,0 @@ |
|||||
{% extends "admin/base_site.html" %} |
|
||||
{% load i18n %} |
|
||||
|
|
||||
{% block title %}{% trans 'Serviço em manutenção (503) | SIGI' %}{% endblock %} |
|
||||
|
|
||||
{% block branding %}{% endblock %} |
|
||||
{% block menu-principal %}{% endblock %} |
|
||||
{% block breadcrumbs %}{% endblock %} |
|
||||
|
|
||||
{% block content %} |
|
||||
<h1>{% trans 'SIGI em manutenção' %}</h1> |
|
||||
|
|
||||
<p>{% trans 'Esta página está atualmente em manutenção! Por favor, tente novamente mais tarde.' %}</p> |
|
||||
|
|
||||
<p>{% trans 'Obrigado pela paciência' %},<br /> |
|
||||
{% trans 'Serviço de Pesquisa e Desenvolvimento Tecnológico (SPDT)' %}</p> |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block footer %}{% endblock %} |
|
@ -1,16 +0,0 @@ |
|||||
{% load i18n %} |
|
||||
<div class="actions" style="display:inline-block;"> |
|
||||
{% for field in action_form %}{% if field.label %}<span style="vertical-align:middle">{{ field.label }}</span> {% endif %}{{ field }}{% endfor %} |
|
||||
<button type="submit" class="btn btn-default btn-sm" title="{% trans "Run the selected action" %}" name="index" value="{{ action_index|default:0 }}">{% trans "Go" %}</button> |
|
||||
{% if actions_selection_counter %} |
|
||||
<script type="text/javascript">var _actions_icnt="{{ cl.result_list|length|default:"0" }}";</script> |
|
||||
<span class="action-counter" style="vertical-align:middle">{{ selection_note }}</span> |
|
||||
{% if cl.result_count != cl.result_list|length %} |
|
||||
<span class="all" style="vertical-align:middle">{{ selection_note_all }}</span> |
|
||||
<span class="question" style="vertical-align:middle"> |
|
||||
<a class="btn" href="javascript:;" title="{% trans "Click here to select the objects across all pages" %}">{% blocktrans with cl.result_count as total_count %}Select all {{ total_count }} {{ module_name }}{% endblocktrans %}</a> |
|
||||
</span> |
|
||||
<span class="clear" style="vertical-align:middle"><a class="btn" href="javascript:;">{% trans "Clear selection" %}</a></span> |
|
||||
{% endif %} |
|
||||
{% endif %} |
|
||||
</div> |
|
@ -1,10 +0,0 @@ |
|||||
{% extends "admin/index.html" %} |
|
||||
{% load static from staticfiles %} |
|
||||
|
|
||||
{% block extrastyle %} |
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'css/globalnav-estilos.css' %}" /> |
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'css/base_site.css' %}" /> |
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'css/app_index.css' %}" /> |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block breadcrumbs %}{% endblock %} |
|
@ -1,188 +1,16 @@ |
|||||
{% load admin_static bootstrapped_goodies_tags %} |
{% extends "admin/base.html" %} |
||||
{% load i18n %} |
{% load django_bootstrap5 %} |
||||
{% load menus %} |
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
{% block extrastyle %} |
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE|default:"en-us" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}> |
{% bootstrap_css %} |
||||
<head> |
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css"> |
||||
<title>{% block title %}{% endblock %}</title> |
{% endblock %} |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> |
|
||||
<meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8" /> |
{% block extrahead %} |
||||
|
{% bootstrap_javascript %} |
||||
{% block extrastyle %}{% endblock %} |
{% endblock %} |
||||
|
|
||||
<!-- Le styles, placed after extrastyle to correctly override default styling --> |
{% block responsive %} |
||||
<link href="{% static "bootstrap/css/bootstrap.min.css" %}" rel="stylesheet"/> |
{{ block.super }} |
||||
<style type="text/css"> |
<meta charset="utf-8"> |
||||
body { |
{% endblock %} |
||||
padding: 10px 20px 40px; |
|
||||
} |
|
||||
</style> |
|
||||
<link href="{% static "bootstrap/css/bootstrap-theme.min.css" %}" rel="stylesheet"/> |
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/overrides.css" %}" /> |
|
||||
|
|
||||
<!-- <link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% static "admin/css/base.css" %}{% endblock %}" /> --> |
|
||||
<script type="text/javascript"> |
|
||||
//<![CDATA[ |
|
||||
window.__admin_media_prefix__ = "{% filter escapejs %}{% static "admin/" %}{% endfilter %}"; |
|
||||
//]]> |
|
||||
</script> |
|
||||
|
|
||||
{% block default_javascript %} |
|
||||
{# We should be able to turn this off, to avoid conflict in integrated pages like petaho's dashboards #} |
|
||||
<script src="{% static "admin/js/jquery-1.9.1.min.js" %}"></script> |
|
||||
<script src="{% static "admin/js/jquery-migrate-1.2.1.min.js" %}"></script> |
|
||||
<script src="{% static "bootstrap/js/bootstrap.min.js" %}"></script> |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block extrahead %}{% endblock %} |
|
||||
|
|
||||
{% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE" />{% endblock %} |
|
||||
<script type="text/javascript"> |
|
||||
//<![CDATA[ |
|
||||
(function($) { |
|
||||
$(document).ready(function() { |
|
||||
$('input[type="submit"]').addClass('btn'); |
|
||||
$('[title]').tooltip(); |
|
||||
}); |
|
||||
}(jQuery)); |
|
||||
//]]> |
|
||||
</script> |
|
||||
</head> |
|
||||
|
|
||||
<body class="{% if is_popup %}popup {% endif %}{% block bodyclass %}{% endblock %}"> |
|
||||
|
|
||||
<!-- Container --> |
|
||||
<div class="container-fluid"> |
|
||||
|
|
||||
{% if not is_popup %} |
|
||||
|
|
||||
{% block container-top %}{% endblock %} |
|
||||
|
|
||||
<!-- Header --> |
|
||||
<div id="navbar-title-tools" class="navbar navbar-static-top"> |
|
||||
<div class="navbar-inner"> |
|
||||
<div class="container-fluid"> |
|
||||
<div class="navbar-header"> |
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> |
|
||||
<span class="icon-bar"></span> |
|
||||
<span class="icon-bar"></span> |
|
||||
<span class="icon-bar"></span> |
|
||||
</button> |
|
||||
{% block branding %}{% endblock %} |
|
||||
</div> |
|
||||
<div class="navbar-collapse collapse navbar-right"> |
|
||||
<ul class="nav navbar-nav"> |
|
||||
{% if user.is_active and user.is_staff %} |
|
||||
<li class="dropdown"> |
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{% trans 'Welcome,' %} <strong>{% filter force_escape %}{% firstof user.get_short_name user.get_username user.first_name user.username %}{% endfilter %}</strong> <span class="caret"></span></a> |
|
||||
<ul class="dropdown-menu"> |
|
||||
{% if user.has_usable_password %} |
|
||||
<li><a href="{% url 'admin:password_change' %}">{% trans 'Change password' %}</a></li> |
|
||||
{% endif %} |
|
||||
<li><a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a></li> |
|
||||
</ul> |
|
||||
</li> |
|
||||
{% block languages %} |
|
||||
<li class="divider-vertical"></li> |
|
||||
{% language_selector %} |
|
||||
{% endblock languages %} |
|
||||
{% block logs %} |
|
||||
<li class="dropdown" id="recent-actions-module"> |
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{% trans 'Recent Actions' %} <b class="caret"></b></a> |
|
||||
{% load log %} |
|
||||
{% get_admin_log 10 as admin_log for_user user %} |
|
||||
<ul class="dropdown-menu"> |
|
||||
{% for entry in admin_log %} |
|
||||
<li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}"> |
|
||||
<a href="{% if entry.is_deletion or not entry.get_admin_url %}#{% else %}{{ entry.get_admin_url }}{% endif %}"> |
|
||||
<i class="icon-{% if entry.is_addition %}plus{% endif %}{% if entry.is_change %}edit{% endif %}{% if entry.is_deletion %}remove{% endif %}"></i> |
|
||||
{{ entry.object_repr }} |
|
||||
{% if entry.content_type %} |
|
||||
<span class="mini quiet">({% filter capfirst %}{% trans entry.content_type.name %}{% endfilter %})</span> |
|
||||
{% else %} |
|
||||
<span class="mini quiet">({% trans 'Unknown content' %})</span> |
|
||||
{% endif %} |
|
||||
</a> |
|
||||
</li> |
|
||||
{% empty %} |
|
||||
<li class="disabled"><a href="#">{% trans 'None available' %}</a></li> |
|
||||
{% endfor %} |
|
||||
</ul> |
|
||||
</li> |
|
||||
{% endblock %} |
|
||||
{% block userlinks %} |
|
||||
{% url 'django-admindocs-docroot' as docsroot %} |
|
||||
{% if docsroot %} |
|
||||
<li class="divider-vertical"></li> |
|
||||
<li><a href="{{ docsroot }}">{% trans 'Documentation' %}</a></li> |
|
||||
{% endif %} |
|
||||
{% endblock %} |
|
||||
{% endif %} |
|
||||
{% block nav-global %}{% endblock %} |
|
||||
</ul> |
|
||||
</div><!--/.nav-collapse --> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<!-- END Header --> |
|
||||
|
|
||||
{% block menu-principal %} |
|
||||
<div role="navigation" class="navbar navbar-default"> |
|
||||
<div class="container-fluid"> |
|
||||
<div class="navbar-header"> |
|
||||
<button data-target=".navbar-collapse" data-toggle="collapse" class="navbar-toggle collapsed" type="button"> |
|
||||
<span class="sr-only">Toggle navigation</span> |
|
||||
<span class="icon-bar"></span> |
|
||||
<span class="icon-bar"></span> |
|
||||
<span class="icon-bar"></span> |
|
||||
</button> |
|
||||
</div> |
|
||||
<div class="navbar-collapse collapse"> |
|
||||
{% show_menu "main_menu" %} |
|
||||
</div><!--/.nav-collapse --> |
|
||||
</div><!--/.container-fluid --> |
|
||||
</div> |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% endif %} |
|
||||
|
|
||||
<!-- Content --> |
|
||||
<div id="content" class="{% block coltype %}colM{% endblock %}"> |
|
||||
|
|
||||
{% block content_title %}{% if title %}<h1>{{ title }}</h1>{% endif %}{% endblock %} |
|
||||
|
|
||||
{% block navbar %} |
|
||||
<div id="navbar-object-tools" class="nav"> |
|
||||
{% block object-tools %} |
|
||||
<ul class="object-tools pull-left nav nav-pills"> |
|
||||
{% block object-tools-items %}{% endblock %} |
|
||||
</ul> |
|
||||
{% endblock %} |
|
||||
</div> |
|
||||
{% endblock navbar %} |
|
||||
|
|
||||
{% block messages %} |
|
||||
{% if messages %} |
|
||||
<div class="row"> |
|
||||
<div class="col-sm-12"> |
|
||||
{% for message in messages %} |
|
||||
<div class="alert alert-info {% if message.tags %}{{ message.tags }}{% endif %}"> |
|
||||
{{ message }} |
|
||||
</div> |
|
||||
{% endfor %} |
|
||||
</div> |
|
||||
</div> |
|
||||
{% endif %} |
|
||||
{% endblock messages %} |
|
||||
|
|
||||
{% block content %}{{ content }}{% endblock %} |
|
||||
{% block sidebar %}{% endblock %} |
|
||||
</div> |
|
||||
<!-- END Content --> |
|
||||
|
|
||||
{% block footer %}<footer id="footer"></footer>{% endblock %} |
|
||||
</div> |
|
||||
<!-- END Container --> |
|
||||
|
|
||||
</body> |
|
||||
</html> |
|
@ -1,62 +0,0 @@ |
|||||
{% extends "admin/base.html" %} |
|
||||
{% load i18n %}{% load admin_static bootstrapped_goodies_tags %} |
|
||||
{% load static from staticfiles %} |
|
||||
|
|
||||
{% block title %}{{ title }} | SIGI{% endblock %} |
|
||||
|
|
||||
{% block extrastyle %} |
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'css/globalnav-estilos.css' %}" /> |
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'css/base_site.css' %}" /> |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block extrahead %} |
|
||||
<meta name="copyright" content="Copyright (c) 2008 Interlegis. Todos |
|
||||
Direitos Reservados." /> |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block container-top %} |
|
||||
<ul id="globalnavbar"> |
|
||||
<li class="globalnav-busca"> |
|
||||
<form action="http://www.interlegis.leg.br/search"> |
|
||||
<input type="text" name="SearchableText" size="8" placeholder="Pesquisar" /> |
|
||||
</form> |
|
||||
</li> |
|
||||
<li><a href="http://saberes.interlegis.leg.br/" title="Saberes - Ambiente de Aprendizagem a Distância" class="globalnav-saberes">Saberes</a></li> |
|
||||
<li><a href="http://colab.interlegis.leg.br/" title="Colab - Comunidades Interlegis" class="globalnav-colab">Colab</a></li> |
|
||||
<li><a href="https://intranet.interlegis.leg.br/" title="Intranet Interlegis" class="globalnav-intranet">Intranet</a></li> |
|
||||
<li><a href="http://www.interlegis.leg.br/" title="Portal Interlegis" class="globalnav-portal">Portal</a></li> |
|
||||
</ul> |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block branding %} |
|
||||
<a class="navbar-brand" href="/">{% trans 'Sistema de Informações Gerenciais do Interlegis' %}</a> |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block nav-global %} |
|
||||
{% if user.is_superuser %} |
|
||||
<li class="dropdown"> |
|
||||
<a data-toggle="dropdown" class="dropdown-toggle" href="#">{% trans 'Administração' %} <b class="caret"></b></a> |
|
||||
<ul class="dropdown-menu"> |
|
||||
<li><a href="/auth/">{% trans 'Usuários' %} & {% trans 'Grupos' %}</a></li> |
|
||||
<li><a href="/sites/site/">{% trans 'Sites' %}</a></li> |
|
||||
<li><a href="/diagnosticos/">{% trans 'Diagnósticos' %}</a></li> |
|
||||
<li><a href="{% url 'importar-casas' %}">{% trans 'Importar dados de Casas' %}</a></li> |
|
||||
</ul> |
|
||||
</li> |
|
||||
{% endif %} |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block footer %} |
|
||||
{% if not is_popup %} |
|
||||
|
|
||||
<div id="footer"> |
|
||||
<div class="footernote"> |
|
||||
<p>{% trans 'Em caso de dúvida no uso do sistema contate o SPDT no ramal 2587' %}.</p> |
|
||||
<p>{% trans 'É recomendado o uso das informações aqui fornecidas fora do âmbito do Interlegis' %}.</p> |
|
||||
<p>{% trans 'SIGI é um software livre e seus fontes estão disponíveis no' %} <a href="http://colab.interlegis.leg.br/wiki/ProjetoSigi">Colab</a>.</p> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
{% endif %} |
|
||||
{% endblock %} |
|
||||
|
|
@ -1,98 +0,0 @@ |
|||||
{% extends "admin/base_site.html" %} |
|
||||
{% load i18n %} |
|
||||
{% block extrastyle %} |
|
||||
{{ block.super }} |
|
||||
<style> |
|
||||
.botoes{ |
|
||||
|
|
||||
/*background: url("../../static/admin/img/nav-bg.gif");*/ |
|
||||
font-weight: bold; |
|
||||
/*color: red;*/ |
|
||||
} |
|
||||
.botoes input{ |
|
||||
background: none; |
|
||||
font-weight: bold; |
|
||||
border: none; |
|
||||
color: blue; |
|
||||
} |
|
||||
.botoes li { |
|
||||
background-image: url("../../static/admin/img/nav-bg.gif"); |
|
||||
display: inline; |
|
||||
border: 1px solid #CCC; |
|
||||
padding: 5px 10px; |
|
||||
margin: 0px; |
|
||||
} |
|
||||
.botoes a{ |
|
||||
} |
|
||||
.botao_excluir input{ |
|
||||
color: red; |
|
||||
background: url("../../static/admin/img/icon_deletelink.gif") no-repeat scroll 0 50% transparent |
|
||||
} |
|
||||
</style> |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block title %}{% trans 'Carrinho | SIGI' %}{% endblock %} |
|
||||
{% block content_title %}<h1>{% trans 'Carrinho' %}</h1>{% endblock %} |
|
||||
|
|
||||
{% block content %} |
|
||||
<div id="content-main"> |
|
||||
|
|
||||
|
|
||||
{% block mensagem %} |
|
||||
<ul class="messagelist"> |
|
||||
{%if carIsEmpty%} |
|
||||
<li class="warning">{% trans 'O carrinho está vazio' %}</li> |
|
||||
{%else%} |
|
||||
<li>{{paginas.paginator.count}} {% trans 'Itens no carrinho' %}.</li> |
|
||||
{%endif%} |
|
||||
</ul> |
|
||||
{% endblock %} |
|
||||
|
|
||||
|
|
||||
<div id="changelist" class="module"> |
|
||||
<form action="{% block action %}#{% endblock %}" |
|
||||
class="changelist-form" method="post">{% csrf_token %} |
|
||||
{%if not carIsEmpty%} |
|
||||
<div class="botoes"> |
|
||||
<ul class="botao_excluir"> |
|
||||
<li><input class="botao_excluir" type="submit" value=" Excluir do carrinho os itens selecionados" /></li> |
|
||||
<li><a href="excluir_carrinho">{% trans 'Esvaziar carrinho' %}</a></li> |
|
||||
</ul> |
|
||||
</div> |
|
||||
{% endif %} |
|
||||
<div class="result_list"> |
|
||||
{% block tabela %}{% endblock %} |
|
||||
</div> |
|
||||
{%if not carIsEmpty%} |
|
||||
<div class="botoes"> |
|
||||
<ul class="botao_excluir"> |
|
||||
<li><input class="botao_excluir" type="submit" value=" Excluir do carrinho os itens selecionados" /></li> |
|
||||
<li><a href="excluir_carrinho">{% trans 'Esvaziar carrinho' %}</a></li> |
|
||||
</ul> |
|
||||
</div> |
|
||||
{% endif %} |
|
||||
|
|
||||
<div class="paginator"> |
|
||||
<span class="step-links"> |
|
||||
{% if paginas.has_previous %} |
|
||||
<a href="?page={{ paginas.previous_page_number }}">{% trans 'Anterior' %}</a> |
|
||||
{% endif %} |
|
||||
|
|
||||
<span class="this-page"> |
|
||||
Página {{ paginas.number }} de {{ paginas.paginator.num_pages }}. |
|
||||
</span> |
|
||||
|
|
||||
{% if paginas.has_next %} |
|
||||
<a href="?page={{ paginas.next_page_number }}">{% trans 'Próxima' %}</a> |
|
||||
{% endif %} |
|
||||
</span> |
|
||||
<span>{{paginas.paginator.count}} {% trans 'itens' %}</span> |
|
||||
</div> |
|
||||
</form> |
|
||||
|
|
||||
{% block botoes %}{% endblock %} |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
</div> |
|
||||
{% endblock %} |
|
@ -1,121 +0,0 @@ |
|||||
{% extends "admin/base_site.html" %} |
|
||||
{% load i18n admin_urls admin_static admin_list bootstrapped_goodies_tags %} |
|
||||
|
|
||||
{% block extrastyle %} |
|
||||
{{ block.super }} |
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/changelists.css" %}" /> |
|
||||
{% if cl.formset %} |
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" /> |
|
||||
{% endif %} |
|
||||
{% if cl.formset or action_form %} |
|
||||
{% url 'admin:jsi18n' as jsi18nurl %} |
|
||||
<script type="text/javascript" src="{{ jsi18nurl|default:'../../jsi18n/' }}"></script> |
|
||||
{% endif %} |
|
||||
{{ media.css }} |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block extrahead %} |
|
||||
{{ block.super }} |
|
||||
{{ media.js }} |
|
||||
{% if action_form %}{% if actions_on_top or actions_on_bottom %} |
|
||||
<script type="text/javascript"> |
|
||||
(function($) { |
|
||||
$(document).ready(function($) { |
|
||||
$("tr input.action-select").actions(); |
|
||||
}); |
|
||||
})(django.jQuery); |
|
||||
</script> |
|
||||
{% endif %}{% endif %} |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block bodyclass %}_change-list{% endblock %} |
|
||||
|
|
||||
{% block coltype %}flex{% endblock %} |
|
||||
|
|
||||
{% block object-tools %} |
|
||||
<ul class="object-tools pull-left nav nav-pills"> |
|
||||
{% block object-tools-items %} |
|
||||
{% if has_add_permission %} |
|
||||
<li> |
|
||||
{% url cl.opts|admin_urlname:'add' as add_url %} |
|
||||
<a href="{% add_preserved_filters add_url is_popup %}"> |
|
||||
<span class="glyphicon glyphicon-plus"></span> {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} |
|
||||
</a> |
|
||||
</li> |
|
||||
{% endif %} |
|
||||
{% endblock %} |
|
||||
</ul> |
|
||||
{% if cl.has_filters %} |
|
||||
<ul class="nav navbar-nav pull-right"> |
|
||||
<li class="dropdown"> |
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{% trans 'Filter' %} <span class="caret"></span></a> |
|
||||
<ul class="dropdown-menu pull-right"> |
|
||||
{% for spec in cl.filter_specs %} |
|
||||
{% admin_list_filter cl spec %} |
|
||||
{% endfor %} |
|
||||
</ul> |
|
||||
</li> |
|
||||
</ul> |
|
||||
{% endif %} |
|
||||
{% block search %}{% search_form cl %}{% endblock %} |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block content %} |
|
||||
{% block extra_search %}{% endblock %} |
|
||||
<form class="" id="changelist-form" action="" method="post"{% if cl.formset.is_multipart %} enctype="multipart/form-data"{% endif %}>{% csrf_token %} |
|
||||
|
|
||||
{% if cl.formset.errors %} |
|
||||
<div class="alert alert-danger"> |
|
||||
<p class="errornote"> |
|
||||
{% blocktrans count cl.formset.errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} |
|
||||
</p> |
|
||||
{{ cl.formset.non_form_errors }} |
|
||||
</div> |
|
||||
{% endif %} |
|
||||
|
|
||||
|
|
||||
{% with app_name=cl.opts.module_name|lower|slugify %} |
|
||||
{% render_with_template_if_exist cl.opts.app_label|lower|add:"/admin_app_"|add:app_name|add:"_description.html" "" %} |
|
||||
{% endwith %} |
|
||||
|
|
||||
{% if action_form and actions_on_top and cl.full_result_count %} |
|
||||
<div class='pull-left'>{% admin_actions %}</div> |
|
||||
{% endif %} |
|
||||
|
|
||||
<div id="content-main"> |
|
||||
<div class="module{% if cl.has_filters %} filtered{% endif %}" id="_changelist"> |
|
||||
{% block date_hierarchy %} |
|
||||
{% date_hierarchy cl %} |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% if cl.formset %} |
|
||||
<div>{{ cl.formset.management_form }}</div> |
|
||||
{% endif %} |
|
||||
|
|
||||
{% block result_list %} |
|
||||
{% result_list cl %} |
|
||||
{% endblock %} |
|
||||
</div> |
|
||||
</div> |
|
||||
{# {% if cl.formset and cl.result_count %} #} |
|
||||
<div class="navbar navbar-default"> |
|
||||
<div class="navbar-inner"> |
|
||||
<div class="navbar-form pull-left"> |
|
||||
{% if action_form and actions_on_bottom and cl.full_result_count %} |
|
||||
{% admin_actions %} |
|
||||
{% endif %} |
|
||||
</div> |
|
||||
<div class="navbar-form pull-right"> |
|
||||
<input type="submit" name="_save" class="btn btn-primary default" value="{% trans 'Save' %}"/> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
{# {% endif %} #} |
|
||||
|
|
||||
{% block pagination %} |
|
||||
{% pagination cl %} |
|
||||
{% endblock %} |
|
||||
</form> |
|
||||
{% endblock %} |
|
||||
|
|
||||
|
|
@ -1,64 +0,0 @@ |
|||||
{% extends "admin/base_site.html" %} |
|
||||
{% load i18n admin_static %} |
|
||||
|
|
||||
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/login.css" %}" />{% endblock %} |
|
||||
|
|
||||
{% block bodyclass %}login{% endblock %} |
|
||||
|
|
||||
{% block menu-principal %}{% endblock %} |
|
||||
|
|
||||
{% block content_title %}{% endblock %} |
|
||||
|
|
||||
{% block breadcrumbs %}{% endblock %} |
|
||||
|
|
||||
{% block container-top %}{% endblock %} |
|
||||
|
|
||||
{% block branding %} |
|
||||
<h1 id="site-name">SIGI</h1> |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block content %} |
|
||||
{% if form.errors and not form.non_field_errors and not form.this_is_the_login_form.errors %} |
|
||||
<p class="errornote"> |
|
||||
{% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} |
|
||||
</p> |
|
||||
{% endif %} |
|
||||
|
|
||||
{% if form.non_field_errors or form.this_is_the_login_form.errors %} |
|
||||
{% for error in form.non_field_errors|add:form.this_is_the_login_form.errors %} |
|
||||
<p class="errornote"> |
|
||||
{{ error }} |
|
||||
</p> |
|
||||
{% endfor %} |
|
||||
{% endif %} |
|
||||
|
|
||||
<div id="content-main"> |
|
||||
<form action="{{ app_path }}" method="post" id="login-form">{% csrf_token %} |
|
||||
<div class="form-row"> |
|
||||
{% if not form.this_is_the_login_form.errors %}{{ form.username.errors }}{% endif %} |
|
||||
<label for="id_username" class="required">{{ form.username.label }}:</label> {{ form.username }} |
|
||||
</div> |
|
||||
<div class="form-row"> |
|
||||
{% if not form.this_is_the_login_form.errors %}{{ form.password.errors }}{% endif %} |
|
||||
<label for="id_password" class="required">{% trans 'Password' %}:</label> {{ form.password }} |
|
||||
<input type="hidden" name="this_is_the_login_form" value="1" /> |
|
||||
<input type="hidden" name="next" value="{{ next }}" /> |
|
||||
</div> |
|
||||
{% url 'admin_password_reset' as password_reset_url %} |
|
||||
{% if password_reset_url %} |
|
||||
<div class="password-reset-link"> |
|
||||
<a href="{{ password_reset_url }}">{% trans 'Forgotten your password or username?' %}</a> |
|
||||
</div> |
|
||||
{% endif %} |
|
||||
<div class="submit-row"> |
|
||||
<label> </label><input type="submit" value="{% trans 'Log in' %}" /> |
|
||||
</div> |
|
||||
</form> |
|
||||
|
|
||||
<script type="text/javascript"> |
|
||||
document.getElementById('id_username').focus() |
|
||||
</script> |
|
||||
</div> |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block footer %}{% endblock %} |
|
@ -1,25 +0,0 @@ |
|||||
{% load i18n admin_static %} |
|
||||
{% if cl.search_fields %} |
|
||||
|
|
||||
<form class="navbar-form navbar-right" role="search" id="changelist-search" action="" method="get"> |
|
||||
|
|
||||
<div class="form-group"><!-- DIV needed for valid HTML --> |
|
||||
<div class="input-group"> |
|
||||
<input type="text" class="form-control search-query" placeholder="{% trans 'Search' %}" size="40" name="{{ search_var }}" value="{{ cl.query }}" id="searchbar" /> |
|
||||
<span class="input-group-btn"> |
|
||||
<button class="btn btn-default" type="submit"> |
|
||||
<span class="glyphicon glyphicon-search"></span> |
|
||||
</button> |
|
||||
</span> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
{% if show_result_count %} |
|
||||
<span class="small quiet">{% blocktrans count counter=cl.result_count %}{{ counter }} result{% plural %}{{ counter }} results{% endblocktrans %} (<a href="?{% if cl.is_popup %}pop=1{% endif %}">{% blocktrans with full_result_count=cl.full_result_count %}{{ full_result_count }} total{% endblocktrans %}</a>)</span> |
|
||||
{% endif %} |
|
||||
{% for pair in cl.params.items %} |
|
||||
{% ifnotequal pair.0 search_var %}<input type="hidden" name="{{ pair.0 }}" value="{{ pair.1 }}"/>{% endifnotequal %} |
|
||||
{% endfor %} |
|
||||
</form> |
|
||||
<script type="text/javascript">document.getElementById("searchbar").focus();</script> |
|
||||
{% endif %} |
|
@ -1,33 +0,0 @@ |
|||||
{% load static from staticfiles %} |
|
||||
{% load i18n %} |
|
||||
|
|
||||
<!--CSS JQuery--> |
|
||||
<link type="text/css" href="{% static 'css/jquery/smoothness/jquery.ui.all.css' %}" rel="stylesheet" /> |
|
||||
|
|
||||
<!--Scripts JQuery--> |
|
||||
<script type="text/javascript" src="{% static 'js/jquery/jquery-1.4.2.js' %}" ></script> |
|
||||
<script type="text/javascript" src="{% static 'js/jquery/ui/jquery.ui.core.js' %}" ></script> |
|
||||
<script type="text/javascript" src="{% static 'js/jquery/ui/jquery.ui.widget.js' %}" ></script> |
|
||||
<script type="text/javascript" src="{% static 'js/jquery/ui/jquery.ui.tabs.js' %}" ></script> |
|
||||
<script type="text/javascript" src="{% static 'js/jquery/ui/jquery.ui.mouse.js' %}" ></script> |
|
||||
<script type="text/javascript" src="{% static 'js/jquery/ui/jquery.ui.sortable.js' %}" ></script> |
|
||||
<script type="text/javascript"> |
|
||||
$(function() { |
|
||||
$( "#tabs" ).tabs({ |
|
||||
event: "mouseover" |
|
||||
}); |
|
||||
}); |
|
||||
</script> |
|
||||
|
|
||||
<script> |
|
||||
$(function() { |
|
||||
$( "#sortable" ).sortable(); |
|
||||
$( "#sortable" ).disableSelection(); |
|
||||
}); |
|
||||
</script> |
|
||||
|
|
||||
<style> |
|
||||
.ui-tabs-nav { |
|
||||
background-image: url("{% static 'admin/img/nav-bg.gif' %}" ); |
|
||||
} |
|
||||
</style> |
|
@ -1,20 +0,0 @@ |
|||||
{% extends "admin/change_form.html" %} |
|
||||
{% load i18n admin_urls %} |
|
||||
|
|
||||
{% block object-tools %} |
|
||||
{% if change %}{% if not is_popup %} |
|
||||
<ul class="nav navbar-nav navbar-left"> |
|
||||
{% block object-tools-items %} |
|
||||
<li> |
|
||||
{% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %} |
|
||||
<a href="{% add_preserved_filters history_url %}" class="historylink"> |
|
||||
<span class="glyphicon glyphicon-book"></span> |
|
||||
{% trans "History" %} |
|
||||
</a> |
|
||||
</li> |
|
||||
{% if has_absolute_url %}<li><a href="{% url 'admin:view_on_site' content_type_id original.pk %}" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif%} |
|
||||
{% endblock %} |
|
||||
</ul> |
|
||||
{% endif %}{% endif %} |
|
||||
{% endblock %} |
|
||||
|
|
@ -1,56 +0,0 @@ |
|||||
{% load static from staticfiles %} |
|
||||
{% load i18n %} |
|
||||
<!DOCTYPE html> |
|
||||
<html lang="pt-BR"> |
|
||||
<head> |
|
||||
<meta charset="UTF-8" /> |
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|
||||
{% block titulo %} |
|
||||
<title>{% trans 'SIGI - Diagnósticos' %}</title> |
|
||||
{% endblock titulo %} |
|
||||
{% block media %} |
|
||||
<link rel="stylesheet" href="{% static 'jquery.mobile-1.0.1/jquery.mobile-1.0.1.min.css' %}" /> |
|
||||
<script type="text/javascript" src="{% static '/js/jquery/jquery-1.6.4.min.js' %}" ></script> |
|
||||
<script language=javascript> |
|
||||
$(document).bind("mobileinit", function () { |
|
||||
$.mobile.ajaxEnabled = false; |
|
||||
$.mobile.loadingMessage = 'salvando'; |
|
||||
}); |
|
||||
</script> |
|
||||
<script type="text/javascript" src="{% static 'js/jquery/jquery.maskedinput-1.1.3.min.js' %}" /></script> |
|
||||
<script type="text/javascript" src="{% static 'jquery.mobile-1.0.1/jquery.mobile-1.0.1.min.js' %}" ></script> |
|
||||
<script type="text/javascript" src="{% static 'js/diagnosticos/diagnosticos_categorias_form.js' %}" ></script> |
|
||||
{% endblock media %} |
|
||||
</head> |
|
||||
<body> |
|
||||
<div data-role="page" id="page" class="type-interior"> |
|
||||
<div data-role="header" data-position="fixed"> |
|
||||
<img id="working" src="{% static 'img/loader.gif' %}" class="ui-btn-right"/> |
|
||||
{% block cabecalho %}{% endblock cabecalho %} |
|
||||
</div> <!-- header --> |
|
||||
<div data-role="content" class="content-primary"> |
|
||||
{% block corpo %}{% endblock corpo %} |
|
||||
</div><!-- content --> |
|
||||
<div data-role="footer"> |
|
||||
<div data-role="navbar"> |
|
||||
<ul> |
|
||||
{% block rodape %} |
|
||||
<li><a href="{% url 'lista_diagnosticos' %}" data-icon="home">{% trans 'Página Inicial' %}</a></li> |
|
||||
{% endblock rodape %} |
|
||||
</ul> |
|
||||
</div> |
|
||||
</div> <!-- footer --> |
|
||||
</div> <!-- page --> |
|
||||
|
|
||||
<a id='open-dialog' href="#dialog" data-rel="dialog" data-transition="pop" style='display:none;'></a> |
|
||||
<div data-role="page" id="dialog"> |
|
||||
<div data-role="header"> |
|
||||
<h1>{% trans 'Ops! Não foi possivel salvar os dados' %}.</h1> |
|
||||
</div> |
|
||||
<div data-role="content" id="text"> |
|
||||
{% trans 'Algum erro ocorreu ao salvar os dados do diagnóstico' %}. |
|
||||
{% trans 'Verifique a sua conectividade e/ou entre em contato com a equipe técnica o mais rápido possível' %}. |
|
||||
</div> |
|
||||
</div> |
|
||||
</body> |
|
||||
</html> |
|
@ -1,108 +0,0 @@ |
|||||
{% load smart_if %} |
|
||||
{% load static from staticfiles %} |
|
||||
{% load i18n %} |
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
|
||||
<html> |
|
||||
<head> |
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
|
||||
<title>{% block title %}{% trans 'Relatório' %}{% endblock title %}</title> |
|
||||
<style type="text/css"> |
|
||||
td.logo { |
|
||||
text-align: center; |
|
||||
} |
|
||||
td.header_text p { |
|
||||
margin: 0px; |
|
||||
font-size: 1.4em; |
|
||||
} |
|
||||
td.header_text { |
|
||||
width: 550px; |
|
||||
} |
|
||||
h1 { |
|
||||
font-size: 2em; |
|
||||
text-align: center; |
|
||||
} |
|
||||
h2 { |
|
||||
font-size: 1.7em; |
|
||||
} |
|
||||
h3 { |
|
||||
margin-top: 10px; |
|
||||
margin-bottom: 0px; |
|
||||
} |
|
||||
body { |
|
||||
font-family: "Helvetica, Arial, sans-serif"; |
|
||||
font-size: 1.3em; |
|
||||
line-height: 1em; |
|
||||
} |
|
||||
|
|
||||
#footer { |
|
||||
width: 100%; |
|
||||
} |
|
||||
#footer table { |
|
||||
border: 0px; |
|
||||
} |
|
||||
|
|
||||
.footer-left { |
|
||||
text-align: left; |
|
||||
} |
|
||||
.footer-center { |
|
||||
text-align: center; |
|
||||
} |
|
||||
.footer-right { |
|
||||
text-align: right; |
|
||||
} |
|
||||
div.new_page { |
|
||||
page-break-before: always; |
|
||||
} |
|
||||
div.same_page { |
|
||||
-pdf-keep-with-next: true; |
|
||||
} |
|
||||
@page { |
|
||||
size: {% block pagesize %}{{ pagesize }}{% endblock pagesize %}; |
|
||||
margin: 4cm 1cm 1cm 2cm; |
|
||||
font-family: "Helvetica, Arial, sans-serif"; |
|
||||
font-size: 2em; |
|
||||
@frame header { |
|
||||
-pdf-frame-content: header; |
|
||||
top: 1cm; |
|
||||
} |
|
||||
@frame footer { |
|
||||
-pdf-frame-content: footer; |
|
||||
bottom: 0cm; |
|
||||
height: 1cm; |
|
||||
margin-left: 2cm; |
|
||||
margin-right: 1cm; |
|
||||
} |
|
||||
} |
|
||||
</style> |
|
||||
{% block extra_head %} |
|
||||
{% endblock %} |
|
||||
</head> |
|
||||
<body> |
|
||||
<div id="header"> |
|
||||
<table> |
|
||||
<tr> |
|
||||
<td class="logo"><img src="{% static 'img/logo-senado.jpg' %}" /></td> |
|
||||
<td class="header_text"> |
|
||||
<p><strong>{% trans 'SENADO FEDERAL' %}</strong></p> |
|
||||
<p><strong>{% trans 'ILB - PROGRAMA INTERLEGIS' %}</strong></p> |
|
||||
<p>{% block subsecretaria %}{% endblock %}</p> |
|
||||
</td> |
|
||||
<td class="logo"><img src="{% static 'img/logo-interlegis.jpg' %}" /></td> |
|
||||
</tr> |
|
||||
</table> |
|
||||
</div> |
|
||||
{% block report %} |
|
||||
{% endblock %} |
|
||||
<div id="footer"> |
|
||||
{%block page_foot%} |
|
||||
<table> |
|
||||
<tr> |
|
||||
<td class="footer-left">{% trans 'Emissão:' %} {% now "d/m/Y H:i:s" %}</td> |
|
||||
<td class="footer-center"> </td> |
|
||||
<td class="footer-right">{% trans 'Página:' %} <pdf:pagenumber/> </td> |
|
||||
</tr> |
|
||||
</table> |
|
||||
{%endblock%} |
|
||||
</div> |
|
||||
</body> |
|
||||
</html> |
|
@ -1,18 +0,0 @@ |
|||||
{% extends "base_change_form.html" %} |
|
||||
{% load i18n %} |
|
||||
|
|
||||
{% block object-tools-items %} |
|
||||
<li><a href="report_complete/"> |
|
||||
<span class="glyphicon glyphicon-list-alt"></span> |
|
||||
{% trans 'Relatório' %} |
|
||||
</a></li> |
|
||||
<li><a href="labels/"> |
|
||||
<span class="glyphicon glyphicon-th"></span> |
|
||||
{% trans 'Etiqueta' %} |
|
||||
</a></li> |
|
||||
<li><a href="labels_sem_presidente/"> |
|
||||
<span class="glyphicon glyphicon-th-large"></span> |
|
||||
{% trans 'Etiqueta sem presidente' %} |
|
||||
</a></li> |
|
||||
{{ block.super }} |
|
||||
{% endblock %} |
|
@ -1,10 +0,0 @@ |
|||||
{% extends "admin/change_list.html" %} |
|
||||
{% load admin_list i18n reporting_tags %} |
|
||||
|
|
||||
{% block object-tools-items %} |
|
||||
<li><a class="btn" href="carrinho/{{query_str}}"> |
|
||||
<span class="glyphicon glyphicon-shopping-cart"></span> |
|
||||
{% trans 'Ver Carrinho' %} |
|
||||
</a></li> |
|
||||
{{ block.super }} |
|
||||
{% endblock %} |
|
@ -1,5 +0,0 @@ |
|||||
{% load i18n %} |
|
||||
|
|
||||
{% with choices|first as disabled %} |
|
||||
<li class="clear-all-filter{% if disabled %} disabled{% endif %}"><a href="?">{% trans 'Clear All Filters' %}</a></li> |
|
||||
{% endwith %} |
|
@ -1,36 +0,0 @@ |
|||||
{% extends "admin/base_site.html" %} |
|
||||
{% load i18n admin_static %} |
|
||||
{% load static from staticfiles %} |
|
||||
|
|
||||
{% block title %}SIGI{% endblock %} |
|
||||
|
|
||||
{% block extrahead %} |
|
||||
{{ block.super }} |
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}" > |
|
||||
|
|
||||
<script type="text/javascript" src="{% static 'admin/js/core.js' %}" ></script> |
|
||||
<script type="text/javascript" src="{% static 'admin/js/jquery.min.js' %}" ></script> |
|
||||
<script type="text/javascript" src="{% static 'admin/js/jquery.init.js' %}" ></script> |
|
||||
<script type="text/javascript" src="{% static 'js/Chart.min.js' %}" ></script> |
|
||||
<script type="text/javascript" src="{% static 'js/dashboard.js' %}"></script> |
|
||||
|
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block content_title %} |
|
||||
<h1 class="pull-left">{% trans 'Dashboard' %}</h1> |
|
||||
<div class="pull-right"><a href="{% url 'openmap' %}"><img src="{% static 'img/mapicon.png' %}" /> {% trans 'Mapa de atuação do Interlegis' %}</a></div> |
|
||||
{% endblock %} |
|
||||
|
|
||||
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/dashboard.css" %}" />{% endblock %} |
|
||||
|
|
||||
{% block coltype %}colMS{% endblock %} |
|
||||
|
|
||||
{% block bodyclass %}dashboard{% endblock %} |
|
||||
|
|
||||
{% block breadcrumbs %}{% endblock %} |
|
||||
|
|
||||
{% block content %} |
|
||||
<div id="content-main"> |
|
||||
{% include "snippets/modules/charts-convenios.html" %} |
|
||||
</div> |
|
||||
{% endblock %} |
|
@ -1,16 +0,0 @@ |
|||||
{% extends "base_mobile.html" %} |
|
||||
{% load i18n %} |
|
||||
|
|
||||
{% block cabecalho %} |
|
||||
<h1>{% trans 'Ocorreu um erro' %}</h1> |
|
||||
{% endblock cabecalho %} |
|
||||
{% block corpo %} |
|
||||
<p>{% trans 'A página que está procurando não existe.' %} </p> |
|
||||
<p>{% trans 'Verifique se o diagnóstico, categoria ou pergunta está cadastrado no sistema.' %}</p> |
|
||||
<a href="{% url 'lista_diagnosticos' %}" data-icon="arrow-l" |
|
||||
data-direction="reverse" data-role="button" data-theme="c" class="ui-btn-left">{% trans 'Voltar' %}</a> |
|
||||
{% endblock corpo %} |
|
||||
|
|
||||
{% block rodape %} |
|
||||
|
|
||||
{% endblock rodape %} |
|
@ -1,92 +0,0 @@ |
|||||
{% load static from staticfiles %} |
|
||||
{% load i18n %} |
|
||||
|
|
||||
<div class="row row-flex row-flex-wrap"> |
|
||||
<div id="resumoseit" class="col-md-6" data-source="{% url "home_resumoseit" %}"></div> |
|
||||
<div class="col-md-6"> |
|
||||
<div class="panel panel-primary flex-col"> |
|
||||
<div class="panel-heading">{% trans 'Sazonalidade da hospedagem de serviços' %}</div> |
|
||||
<div class="panel-body"> |
|
||||
<div class="chartcontainer"> |
|
||||
<canvas id="chart-area-evolucao" data-source="{% url "home_chartseit" %}" data-legend-id="area-evolucao-legend" data-prevlink-id="area-evolucao-previlink" data-nextlink-id="area-evolucao-nextlink"></canvas> |
|
||||
<div id="area-evolucao-legend"></div> |
|
||||
<div> |
|
||||
<a id="area-evolucao-previlink" href="#" aria-label="{% trans "Retroceder um mês" %}" data-target="chart-area-evolucao"> |
|
||||
<span class="glyphicon glyphicon-chevron-left pull-left" aria-hidden="true"></span> |
|
||||
</a> |
|
||||
<a id="area-evolucao-nextlink" href="#" aria-label="{% trans "Avançar um mês" %}" data-target="chart-area-evolucao"> |
|
||||
<span class="glyphicon glyphicon-chevron-right pull-right" aria-hidden="true"></span> |
|
||||
</a> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<div class="row row-flex row-flex-wrap"> |
|
||||
<div id="resumo" class="col-md-6" data-source="{% url "casas-carteira" %}?snippet=resumo&s=sim"></div> |
|
||||
<div class="col-md-6"> |
|
||||
<div class="panel panel-primary flex-col"> |
|
||||
<div class="panel-heading">{% trans 'Performance da gerência de carteiras' %}</div> |
|
||||
<div class="panel-body"> |
|
||||
<ul class="nav nav-pills" role="tablist"> |
|
||||
<li role="presentation"><a href="{% url "home_chartperformance" %}" data-target="chart-performance">{% trans "Todo o Interlegis" %}</a></li> |
|
||||
{% for g in gerentes %} |
|
||||
<li role="presentation"><a href="{% url "home_chartperformance" %}?servidor={{ g.pk }}" data-target="chart-performance">{{ g.user.first_name }}</a></li> |
|
||||
{% endfor %} |
|
||||
</ul> |
|
||||
<div class="chartcontainer"> |
|
||||
<canvas id="chart-performance" data-source="{% url "home_chartperformance" %}" data-legend-id="chart-performance-all-legend"></canvas> |
|
||||
<div id="chart-performance-all-legend"></div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<div class="row row-flex row-flex-wrap"> |
|
||||
<div class="col-md-6" data-source="{% url "home_resumoconvenios" %}"></div> |
|
||||
<div class="col-md-6"> |
|
||||
<div class="panel panel-primary flex-col"> |
|
||||
<div class="panel-heading">{% trans 'Distribuição de Casas por Gerente' %}</div> |
|
||||
<div class="panel-body"> |
|
||||
<div class="chartcontainer"> |
|
||||
<canvas id="chart-carteira" data-source="{% url "home_chartcarteira" %}" data-legend-id="chart-carteira-legend"></canvas> |
|
||||
<div id="chart-carteira-legend"></div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
{% comment %} |
|
||||
<div class="row row-flex row-flex-wrap"> |
|
||||
<div class="col-md-6"> |
|
||||
<div class="panel panel-primary flex-col"> |
|
||||
<div class="panel-heading">{% trans 'Convênios assinados por projeto' %}</div> |
|
||||
<div class="panel-body"> |
|
||||
<div class="chartcontainer"> |
|
||||
<div> |
|
||||
<canvas id="chart-area-convenios" width="400" height="400" data-source="{% url "home_chartconvenios" %}" data-legend-id="area-convenios-legend"></canvas> |
|
||||
</div> |
|
||||
<div id="area-convenios-legend"></div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<div class="col-md-6"> |
|
||||
<div class="panel panel-primary flex-col"> |
|
||||
<div class="panel-heading">{% trans 'Processos de convênios por projeto' %}</div> |
|
||||
<div class="panel-body"> |
|
||||
<div class="chartcontainer"> |
|
||||
<canvas id="chart-area-processos" width="150" height="150" data-source="{% url "home_chartconvenios" %}?q=assinados" data-legend-id="area-processos-legend"></canvas> |
|
||||
<div id="area-processos-legend"></div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
{% endcomment %} |
|
||||
|
|
@ -1,69 +0,0 @@ |
|||||
{% load i18n %} |
|
||||
|
|
||||
<div class="panel panel-primary flex-col"> |
|
||||
<div class="panel-heading">{% trans 'Resumo de informações' %}</div> |
|
||||
<div class="panel-body table-responsive"> |
|
||||
<dl class="dl-horizontal"> |
|
||||
<dt class="pilllabel">{% trans 'Resumo por região' %}:</dt> |
|
||||
<dd> |
|
||||
<ul class="nav nav-pills"> |
|
||||
<li><a href="{% url 'convenios-report_regiao_pdf' 'CO' %}">Centro Oeste</a></li> |
|
||||
<li><a href="{% url 'convenios-report_regiao_pdf' 'NE' %}">Nordeste</a></li> |
|
||||
<li><a href="{% url 'convenios-report_regiao_pdf' 'NO' %}">Norte</a></li> |
|
||||
<li><a href="{% url 'convenios-report_regiao_pdf' 'SD' %}">Sudeste</a></li> |
|
||||
<li><a href="{% url 'convenios-report_regiao_pdf' 'SL' %}">Sul</a></li> |
|
||||
</ul> |
|
||||
</dd> |
|
||||
</dl> |
|
||||
<table class="table table-condensed numeros"> |
|
||||
<tr> |
|
||||
{% for item in tabela_resumo_camara.cabecalho_topo %} |
|
||||
<th>{{item}}</th> |
|
||||
{% endfor %} |
|
||||
</tr> |
|
||||
{% for cabecalho,lista in tabela_resumo_camara.lista_zip %} |
|
||||
<tr> |
|
||||
<th>{{cabecalho}}</th> |
|
||||
{% for item in lista %} |
|
||||
<td>{{item}}</td> |
|
||||
{% endfor %} |
|
||||
</tr> |
|
||||
{% endfor %} |
|
||||
</table> |
|
||||
</div> |
|
||||
<div class="panel-footer"> |
|
||||
<table class="table table-condensed numeros"> |
|
||||
<tr> |
|
||||
<th>{% trans 'Total de câmaras' %}</th> |
|
||||
<td>{{ tabela_resumo_camara.total_camaras }}</td> |
|
||||
</tr> |
|
||||
|
|
||||
<tr> |
|
||||
<th>{% trans 'Câmaras sem processo' %}</th> |
|
||||
<td>{{ tabela_resumo_camara.camaras_sem_processo }}</td> |
|
||||
</tr> |
|
||||
|
|
||||
<tr> |
|
||||
<th>{% trans 'Casas sem convenio que utilizam algum serviço de hospedagem' %} |
|
||||
<a href="{% url "home_reportsemconvenio" %}?modo=H" target="_blank" aria-label="{% trans "Listar casas" %}" title="{% trans "Listar casas" %}"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span></a> |
|
||||
<a href="{% url "home_reportsemconvenio" %}?modo=H&f=csv" aria-label="{% trans "Download csv" %}" title="{% trans "Download csv" %}"><span class="glyphicon glyphicon-download" aria-hidden="true"></span></a> |
|
||||
</th> |
|
||||
<td>{{ tabela_resumo_camara.sem_convenio.hospedagem|length }}</td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<th>{% trans 'Casas sem convenio que utilizam somente serviço de registro' %} |
|
||||
<a href="{% url "home_reportsemconvenio" %}?modo=R" target="_blank" aria-label="{% trans "Listar casas" %}" title="{% trans "Listar casas" %}"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span></a> |
|
||||
<a href="{% url "home_reportsemconvenio" %}?modo=R&f=csv" aria-label="{% trans "Download csv" %}" title="{% trans "Download csv" %}"><span class="glyphicon glyphicon-download" aria-hidden="true"></span></a> |
|
||||
</th> |
|
||||
<td>{{ tabela_resumo_camara.sem_convenio.registro|length }}</td> |
|
||||
</tr> |
|
||||
<tr> |
|
||||
<th>{% trans 'Casas sem convenio que utilizam algum serviço de registro e/ou hospedagem' %} |
|
||||
<a href="{% url "home_reportsemconvenio" %}" target="_blank" aria-label="{% trans "Listar casas" %}" title="{% trans "Listar casas" %}"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span></a> |
|
||||
<a href="{% url "home_reportsemconvenio" %}?f=csv" aria-label="{% trans "Download csv" %}" title="{% trans "Download csv" %}"><span class="glyphicon glyphicon-download" aria-hidden="true"></span></a> |
|
||||
</th> |
|
||||
<td>{{ tabela_resumo_camara.sem_convenio.total|length }}</td> |
|
||||
</tr> |
|
||||
</table> |
|
||||
</div> |
|
||||
</div> |
|
@ -1,38 +0,0 @@ |
|||||
{% load static from staticfiles %} |
|
||||
{% load i18n %} |
|
||||
|
|
||||
<div class="panel panel-primary flex-col"> |
|
||||
<div class="panel-heading">{% trans 'Serviços hospedados no Interlegis (SEIT)' %}</div> |
|
||||
<div class="panel-body"> |
|
||||
<table class="table table-condensed numeros servicos"> |
|
||||
<tr> |
|
||||
{% for s in tabela_resumo_seit.titulos %} |
|
||||
<th>{{ s }}</th> |
|
||||
{% endfor %} |
|
||||
</tr> |
|
||||
{% for servico in tabela_resumo_seit.servicos %} |
|
||||
<tr> |
|
||||
<th class="dropdown"> |
|
||||
<a id="ddm-{{ servico.nome }}" data-toggle="dropdown" href="#">{{ servico.nome }}</a> |
|
||||
<table class="table table-condensed numeros servicos dropdown-menu" role="menu" aria-labelledby="ddm-{{ servico.nome }}"> |
|
||||
{% for mes in servico.novos_por_mes %} |
|
||||
<tr><th>{{ mes.mes }}</th><td>{{ mes.total }}</td></tr> |
|
||||
{% endfor %} |
|
||||
</table> |
|
||||
</th> |
|
||||
<td>{{ servico.total }}</td> |
|
||||
<td>{{ servico.novos_mes_anterior }}</td> |
|
||||
<td>{{ servico.novos_mes_atual }}</td> |
|
||||
</tr> |
|
||||
{% endfor %} |
|
||||
</table> |
|
||||
<div> |
|
||||
<a href="{% url "home_resumoseit" %}?ano={{ tabela_resumo_seit.mes_anterior.year|safe }}&mes={{ tabela_resumo_seit.mes_anterior.month|safe }}" aria-label="{% trans "Retroceder um mês" %}" data-target="resumoseit"> |
|
||||
<span class="glyphicon glyphicon-chevron-left pull-left" aria-hidden="true"></span> |
|
||||
</a> |
|
||||
<a href="{% url "home_resumoseit" %}?ano={{ tabela_resumo_seit.proximo_mes.year|safe }}&mes={{ tabela_resumo_seit.proximo_mes.month|safe }}" aria-label="{% trans "Avançar um mês" %}" data-target="resumoseit"> |
|
||||
<span class="glyphicon glyphicon-chevron-right pull-right" aria-hidden="true"></span> |
|
||||
</a> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
Loading…
Reference in new issue