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 |
|||
"""Django's command-line utility for administrative tasks.""" |
|||
import os |
|||
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) |
|||
|
|||
|
|||
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 |
|||
django-debug-toolbar==1.2.2 |
|||
ipdb==0.8 |
|||
ipython==2.3.1 |
|||
pygraphviz==1.2 |
|||
-r requirements.txt |
|||
pygraphviz==1.7 |
|||
django-extensions==3.1.3 |
|||
|
@ -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 |
|||
django-bootstrap3==6.2.2 |
|||
django-admin-bootstrapped==2.4.0 |
|||
django-auth-ldap==1.2.7 |
|||
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 |
|||
ipython==7.24.1 |
|||
Django==3.2.4 |
|||
psycopg2==2.8.6 |
|||
django-bootstrap5==2.0.1 |
|||
|
@ -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 os |
|||
from django.core.management.base import BaseCommand, CommandError |
|||
from sigi.apps.contatos.models import Municipio, UnidadeFederativa, Mesorregiao, Microrregiao |
|||
from django.core.management.base import BaseCommand, CommandError, CommandParser |
|||
from sigi.apps.contatos.models import (Municipio, UnidadeFederativa, |
|||
Mesorregiao, Microrregiao) |
|||
|
|||
class Command(BaseCommand): |
|||
args = u"data_file.csv" |
|||
help = u"""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 seguintes campos obrigatórios: |
|||
- cod_uf : Código IBGE da Unidade da Federação |
|||
- cod_mesorregiao : Código IBGE da mesorregião |
|||
- nome_mesorregiao : Nome da mesorregião |
|||
- cod_microrregiao : Código IBGE da microrregião |
|||
- nome_microrregiao : Nome da microrregião |
|||
- cod_municipio : Código IBGE do município |
|||
|
|||
* Os nomes dos campos devem ser grafados exatamente como descrito.""" |
|||
|
|||
campos = {'cod_uf', 'cod_mesorregiao', 'nome_mesorregiao', 'cod_microrregiao', |
|||
'nome_microrregiao', 'cod_municipio'} |
|||
help = """ |
|||
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 |
|||
seguintes campos obrigatórios (Os nomes dos campos devem ser grafados exatamente |
|||
como descrito): |
|||
"cod_uf" (Código IBGE da Unidade da Federação), |
|||
"cod_mesorregiao" (Código IBGE da mesorregião), |
|||
"nome_mesorregiao" (Nome da mesorregião), |
|||
"cod_microrregiao" (Código IBGE da microrregião), |
|||
"nome_microrregiao" (Nome da microrregião), |
|||
"cod_municipio" (Código IBGE do município\n) |
|||
""" |
|||
|
|||
campos = {'cod_uf', 'cod_mesorregiao', 'nome_mesorregiao', |
|||
'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): |
|||
if len(args) != 1: |
|||
raise CommandError(u"Informe UM arquivo csv a importar") |
|||
|
|||
file_name = args[0] |
|||
file_name = options['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) |
|||
|
|||
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 |
|||
|
|||
for reg in reader: |
|||
try: |
|||
uf = UnidadeFederativa.objects.get(codigo_ibge=reg['cod_uf']) |
|||
uf = UnidadeFederativa.objects.get( |
|||
codigo_ibge=reg['cod_uf'] |
|||
) |
|||
except UnidadeFederativa.DoesNotExist: |
|||
self.stdout.write(u"(Linha %s): não existe UF com código IBGE '%s'" % |
|||
(reader.line_num, reg['cod_uf'],)) |
|||
self.stdout.write(self.style.ERROR( |
|||
"(Linha %s): não existe UF com código IBGE '%s'" % |
|||
(reader.line_num, reg['cod_uf']) |
|||
)) |
|||
erros = erros + 1 |
|||
continue |
|||
|
|||
try: |
|||
municipio = Municipio.objects.get(codigo_ibge=reg['cod_municipio']) |
|||
municipio = Municipio.objects.get( |
|||
codigo_ibge=reg['cod_municipio'] |
|||
) |
|||
except Municipio.DoesNotExist: |
|||
self.stdout.write(u"(Linha %s): não existe Município com código IBGE '%s'" % |
|||
(reader.line_num, reg['cod_municipio'],)) |
|||
self.stdout.write(self.style.ERROR( |
|||
"(Linha %s): não existe Município com código IBGE '%s'" |
|||
% (reader.line_num, reg['cod_municipio']) |
|||
)) |
|||
erros = erros + 1 |
|||
continue |
|||
|
|||
cod_meso = reg['cod_uf'] + reg['cod_mesorregiao'] |
|||
cod_micro = cod_meso + reg['cod_microrregiao'] |
|||
|
|||
if Mesorregiao.objects.filter(codigo_ibge=cod_meso).exists(): |
|||
meso = Mesorregiao.objects.get(codigo_ibge=cod_meso) |
|||
else: |
|||
meso = Mesorregiao(codigo_ibge=cod_meso, uf=uf, nome=reg['nome_mesorregiao']) |
|||
meso.nome = reg['nome_mesorregiao'] |
|||
meso, _ = Mesorregiao.objects.get_or_create( |
|||
codigo_ibge=cod_meso, |
|||
defaults={ |
|||
'uf': uf, |
|||
'nome': reg['nome_mesorregiao'] |
|||
} |
|||
) |
|||
meso.save() |
|||
|
|||
if Microrregiao.objects.filter(codigo_ibge=cod_micro).exists(): |
|||
micro = Microrregiao.objects.get(codigo_ibge=cod_micro) |
|||
else: |
|||
micro = Microrregiao(codigo_ibge=cod_micro, mesorregiao=meso, nome=reg['nome_microrregiao']) |
|||
micro.nome = reg['nome_microrregiao'] |
|||
micro, _ = Microrregiao.objects.get_or_create( |
|||
codigo_ibge=cod_micro, |
|||
defaults={ |
|||
'mesorregiao': meso, |
|||
'nome': reg['nome_microrregiao'] |
|||
} |
|||
) |
|||
micro.save() |
|||
|
|||
municipio.microrregiao = micro |
|||
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 |
|||
import string |
|||
from django.utils.translation import gettext as _ |
|||
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): |
|||
# Human-readable title which will be displayed in the |
|||
# right admin sidebar just above the filter options. |
|||
title = '' |
|||
|
|||
# Parameter for the filter that will be used in the URL query. |
|||
parameter_name = '' |
|||
|
|||
def lookups(self, request, model_admin): |
|||
""" |
|||
Returns a list of tuples. The first element in each |
|||
tuple is the coded value for the option that will |
|||
appear in the URL query. The second element is the |
|||
human-readable name for the option that will appear |
|||
in the right sidebar. |
|||
""" |
|||
return ((letter, letter,) for letter in string.ascii_uppercase) |
|||
|
|||
def queryset(self, request, queryset): |
|||
""" |
|||
Returns the filtered queryset based on the value |
|||
provided in the query string and retrievable via |
|||
`self.value()`. |
|||
""" |
|||
if self.value(): |
|||
return queryset.filter((self.parameter_name + '__istartswith', self.value())) |
|||
def expected_parameters(self): |
|||
return [self.lookup_kwarg_gte, self.lookup_kwarg_lt, |
|||
self.lookup_kwarg_isnull] |
|||
|
|||
def choices(self, changelist): |
|||
yield { |
|||
'selected': (self.lookup_val_gte is None and |
|||
self.lookup_val_lt is None and |
|||
self.lookup_val_isnull is None), |
|||
'query_string': changelist.get_query_string(remove=[ |
|||
self.lookup_kwarg_gte, self.lookup_kwarg_lt, |
|||
self.lookup_kwarg_isnull]), |
|||
'display': _('All'), |
|||
} |
|||
last_val = None |
|||
for val in self.lookup_choices: |
|||
val = str(val) |
|||
if last_val is None: |
|||
last_val = val |
|||
yield { |
|||
'selected': self.lookup_val_lt == val, |
|||
'query_string': changelist.get_query_string( |
|||
{self.lookup_kwarg_lt: val}, |
|||
[self.lookup_kwarg_isnull, self.lookup_kwarg_gte]), |
|||
'display': _('Menor que %s') % val, |
|||
} |
|||
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. |
|||
|
|||
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/ |
|||
Generated by 'django-admin startproject' using Django 3.2.4. |
|||
""" |
|||
|
|||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) |
|||
import os |
|||
from os.path import dirname |
|||
|
|||
import django.conf.global_settings as DEFAULT_SETTINGS |
|||
from pathlib import Path |
|||
|
|||
BASE_DIR = dirname(dirname(dirname(__file__))) |
|||
BASE_DIR = Path(__file__).resolve().parent.parent.parent |
|||
|
|||
# Quick-start development settings - unsuitable for production |
|||
# See https://docs.djangoproject.com/en/dev/howto/deployment/checklist/ |
|||
# Security settings |
|||
|
|||
SECRET_KEY = 'django-insecure-7-gj3=#0f5sbwac6k$_rws5-47kze&-vtq=yt=2x9e%)27x%5g' |
|||
DEBUG = True |
|||
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 |
|||
INSTALLED_APPS = ( |
|||
|
|||
'bootstrap3', |
|||
'django_admin_bootstrapped', |
|||
|
|||
INSTALLED_APPS = [ |
|||
'django_bootstrap5', |
|||
'django.contrib.admin', |
|||
'django.contrib.auth', |
|||
'django.contrib.contenttypes', |
|||
'django.contrib.sessions', |
|||
'django.contrib.messages', |
|||
'django.contrib.staticfiles', |
|||
|
|||
# Local apps |
|||
'sigi.apps.home', |
|||
'sigi.apps.utils', |
|||
# 'sigi.apps.home', |
|||
'sigi.apps.contatos', |
|||
'sigi.apps.servidores', |
|||
'sigi.apps.parlamentares', |
|||
'sigi.apps.casas', |
|||
'sigi.apps.convenios', |
|||
'sigi.apps.inventario', |
|||
'sigi.apps.servicos', |
|||
'sigi.apps.metas', |
|||
'sigi.apps.ocorrencias', |
|||
'sigi.apps.financeiro', |
|||
'sigi.apps.diagnosticos', |
|||
'sigi.apps.eventos', |
|||
'sigi.apps.whois', |
|||
|
|||
# Third-party apps |
|||
'localflavor', |
|||
'reporting', |
|||
# 'sigi.apps.servidores', |
|||
# 'sigi.apps.parlamentares', |
|||
# 'sigi.apps.casas', |
|||
# 'sigi.apps.convenios', |
|||
# 'sigi.apps.inventario', |
|||
# 'sigi.apps.servicos', |
|||
# 'sigi.apps.metas', |
|||
# 'sigi.apps.ocorrencias', |
|||
# 'sigi.apps.financeiro', |
|||
# 'sigi.apps.diagnosticos', |
|||
# 'sigi.apps.eventos', |
|||
# 'sigi.apps.whois', |
|||
'django_extensions', |
|||
'easy_thumbnails', |
|||
'image_cropping', |
|||
'rest_framework', |
|||
|
|||
) |
|||
|
|||
MIDDLEWARE_CLASSES = ( |
|||
] |
|||
MIDDLEWARE = [ |
|||
'django.middleware.security.SecurityMiddleware', |
|||
'django.contrib.sessions.middleware.SessionMiddleware', |
|||
'django.middleware.common.CommonMiddleware', |
|||
'django.middleware.csrf.CsrfViewMiddleware', |
|||
'django.contrib.auth.middleware.AuthenticationMiddleware', |
|||
'django.contrib.messages.middleware.MessageMiddleware', |
|||
'django.middleware.clickjacking.XFrameOptionsMiddleware', |
|||
) |
|||
|
|||
] |
|||
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' |
|||
|
|||
# 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 |
|||
# https://docs.djangoproject.com/en/dev/topics/i18n/ |
|||
|
|||
LANGUAGE_CODE = 'pt-br' |
|||
TIME_ZONE = 'UTC' |
|||
USE_I18N = True |
|||
USE_L10N = True |
|||
USE_TZ = 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) |
|||
# 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 = '/' |
|||
LOGIN_URL = '/login/' |
|||
STATIC_ROOT = BASE_DIR / 'static' |
|||
STATIC_URL = '/static/' |
|||
STATICFILES_DIRS = (BASE_DIR / 'sigiStatic', ) |
|||
|
|||
# Using pytest directly (without a test runner) |
|||
TEST_RUNNER = None |
|||
# Media files (uploaded by user) |
|||
|
|||
from easy_thumbnails.conf import Settings as thumbnail_settings |
|||
THUMBNAIL_PROCESSORS = ( |
|||
'image_cropping.thumbnail_processors.crop_corners', |
|||
) + thumbnail_settings.THUMBNAIL_PROCESSORS |
|||
MEDIA_ROOT = BASE_DIR / 'media' |
|||
MEDIA_URL = '/media/' |
|||
|
|||
THUMBNAIL_ALIASES = { |
|||
'': { |
|||
'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, |
|||
}, |
|||
}, |
|||
} |
|||
# Default primary key field type |
|||
|
|||
OSTICKET_URL = 'https://suporte.interlegis.leg.br/scp/tickets.php?a=search&query=%s' |
|||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' |
|||
|
|||
REST_FRAMEWORK = { |
|||
# Use Django's standard `django.contrib.auth` permissions, |
|||
# or allow read-only access for unauthenticated users. |
|||
'DEFAULT_PERMISSION_CLASSES': [ |
|||
'rest_framework.permissions.AllowAny', |
|||
] |
|||
} |
|||
# Admin interface |
|||
|
|||
# Lista de endereços IP que podem acessar a API de whois |
|||
WHOIS_WHITELIST = [ |
|||
'127.0.0.1', |
|||
] |
|||
X_FRAME_OPTIONS='SAMEORIGIN' |
|||
SILENCED_SYSTEM_CHECKS = ['security.W019'] |
@ -1,31 +1,11 @@ |
|||
from base import * |
|||
|
|||
# SECURITY WARNING: keep the secret key used in production secret! |
|||
SECRET_KEY = '0$ip1fb5xtq%a=)-k_4r^(#jn0t^@+*^kihkxkozg-mip7+w3+' |
|||
from sigi.settings.base import * |
|||
|
|||
DATABASES = { |
|||
'default': { |
|||
'ENGINE': 'django.db.backends.postgresql_psycopg2', |
|||
'NAME': 'sigi', |
|||
'NAME': 'sigi-3', |
|||
'USER': 'sigi', |
|||
'PASSWORD': 'sigi', |
|||
'HOST': 'localhost', |
|||
'PASSWORD': '123456', |
|||
'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.urls import patterns, include, url |
|||
from django.conf.urls.static import static |
|||
from django.contrib import admin |
|||
from django.views.generic.base import TemplateView |
|||
|
|||
admin.site.index_template = 'index.html' |
|||
admin.autodiscover() |
|||
|
|||
urlpatterns = patterns( |
|||
'', |
|||
from django.views.static import serve |
|||
from django.urls import path |
|||
|
|||
url(r'^parlamentares/', include('sigi.apps.parlamentares.urls')), |
|||
url(r'^casas/', include('sigi.apps.casas.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) |
|||
urlpatterns = [ |
|||
path('admin/', admin.site.urls), |
|||
] |
|||
|
|||
if settings.DEBUG: |
|||
urlpatterns = patterns( |
|||
'', |
|||
|
|||
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 |
|||
urlpatterns += [ |
|||
path('media/<path:path>/', serve, { |
|||
'document_root': settings.MEDIA_ROOT, |
|||
}), |
|||
] |
@ -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 %} |
|||
{% load i18n %} |
|||
{% load menus %} |
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
|||
<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE|default:"en-us" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}> |
|||
<head> |
|||
<title>{% block title %}{% endblock %}</title> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> |
|||
<meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8" /> |
|||
|
|||
{% block extrastyle %}{% endblock %} |
|||
|
|||
<!-- Le styles, placed after extrastyle to correctly override default styling --> |
|||
<link href="{% static "bootstrap/css/bootstrap.min.css" %}" rel="stylesheet"/> |
|||
<style type="text/css"> |
|||
body { |
|||
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> |
|||
{% extends "admin/base.html" %} |
|||
{% load django_bootstrap5 %} |
|||
|
|||
{% block extrastyle %} |
|||
{% bootstrap_css %} |
|||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css"> |
|||
{% endblock %} |
|||
|
|||
{% block extrahead %} |
|||
{% bootstrap_javascript %} |
|||
{% endblock %} |
|||
|
|||
{% block responsive %} |
|||
{{ block.super }} |
|||
<meta charset="utf-8"> |
|||
{% endblock %} |
@ -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