mirror of https://github.com/interlegis/sigi.git
Sesostris Vieira
4 years ago
4 changed files with 295 additions and 0 deletions
@ -0,0 +1,275 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
import csv |
|||
from collections import OrderedDict |
|||
from django.core.management.base import BaseCommand, CommandError |
|||
from sigi.apps.casas.models import Funcionario |
|||
from sigi.apps.contatos.models import UnidadeFederativa |
|||
from sigi.apps.diagnosticos.models import Categoria, Diagnostico, Resposta |
|||
|
|||
DATATYPES = { |
|||
'text': 'T', |
|||
'float': 'N', |
|||
'date': 'D', |
|||
'one': 'L', |
|||
'many': 'M' |
|||
} |
|||
|
|||
class Command(BaseCommand): |
|||
help = u"""Exporta dados do diagnóstico para o formato Tab-Separated-Values |
|||
do LimeSurvey, conforme documentado em |
|||
https://manual.limesurvey.org/Tab_Separated_Value_survey_structure""" |
|||
|
|||
def handle(self, *args, **options): |
|||
def normalize(l): |
|||
return [s.encode('utf-8') for s in l] |
|||
|
|||
nonum = lambda s: s[s.index(' ')+1:] |
|||
avalue = lambda e: ('Y' if e.title == u'Sim' else 'N' |
|||
if e.title == u'Não' else e.id) |
|||
|
|||
setores = [(i+1, s[0], s[1]) for i, s in enumerate( |
|||
Funcionario.SETOR_CHOICES)] |
|||
|
|||
if len(args) < 2: |
|||
raise CommandError(u"Use: ls_export survey_id struct.txt data.csv") |
|||
|
|||
survey_id = args[0] |
|||
|
|||
lsf = csv.writer(open(args[1], 'wb+'), delimiter="\t", |
|||
quoting=csv.QUOTE_MINIMAL) |
|||
|
|||
struct = ['id', 'token', 'submitdate', 'lastpage', 'startlanguage', |
|||
'seed'] |
|||
|
|||
self.stdout.write("Exporting survey structure: ") |
|||
# Structure headers # |
|||
self.stdout.write("\tStructure headers...", ending=" ") |
|||
lsf.writerow(['id', 'related_id', 'class', 'type/scale', 'name', |
|||
'relevance', 'text', 'help', 'language', 'validation', |
|||
'mandatory', 'other', 'default', 'same_default']) |
|||
lsf.writerows([ |
|||
['', '', 'S', '', 'sid', '', survey_id], |
|||
['', '', 'S', '', 'format', '', 'G'], |
|||
['', '', 'S', '', 'language', '', 'pt-BR'], |
|||
['', '', 'SL', '', 'surveyls_survey_id', '', survey_id, '', |
|||
'pt-BR'], |
|||
['', '', 'SL', '', 'surveyls_language', '', 'pt-BR', '', 'pt-BR'], |
|||
['', '', 'SL', '', 'surveyls_title', '', |
|||
u'Diagnóstico PML'.encode('utf-8'), '', 'pt-BR']]) |
|||
self.stdout.write("Done!") |
|||
|
|||
# Identificação da Casa Legislativa e sua equipe # |
|||
self.stdout.write("\tIdentificação da Casa...", ending=" ") |
|||
lsf.writerow(normalize(['1000', '', 'G', '', u'Identificação da Casa', |
|||
'', '', '', 'pt-BR'])) |
|||
lsf.writerow(normalize(['1001', '', 'Q', 'L', 'c001q001', '1', |
|||
u'Região', '', 'pt-BR', '', 'Y', 'N', '', '0'])) |
|||
struct.append('c001q001') |
|||
lsf.writerows([normalize(['1001', '', 'A', '0', sigla, '', nome, '', |
|||
'pt-BR']) for sigla, nome in UnidadeFederativa.REGIAO_CHOICES]) |
|||
lsf.writerow(normalize(['1002', '', 'Q', '!', 'c001q002', '1', |
|||
u'Estado (UF)', '', 'pt-BR', '', 'Y', 'N', '', '0'])) |
|||
struct.append('c001q002') |
|||
lsf.writerows([normalize(['1002', '', 'A', '0', u.sigla, '', u.nome, '', |
|||
'pt-BR']) for u in UnidadeFederativa.objects.all()]) |
|||
lsf.writerow(normalize(['1003', '', 'Q', 'S', 'c001q003', '1', |
|||
u'Município', '', 'pt-BR', '', 'Y', 'N', '', '0'])) |
|||
struct.append('c001q003') |
|||
lsf.writerow(normalize(['1004', '', 'Q', 'D', 'c001q004', '1', |
|||
u'Data de criação do município', '', 'pt-BR', '', 'Y', 'N', '', |
|||
'0'])) |
|||
struct.append('c001q004') |
|||
lsf.writerow(normalize(['1005', '', 'Q', 'S', 'c001q005', '1', |
|||
u'Nome da Casa', '', 'pt-BR', '', 'Y', 'N', '', '0'])) |
|||
struct.append('c001q005') |
|||
lsf.writerow(normalize(['1006', '', 'Q', 'D', 'c001q006', '1', |
|||
u'Data de instalação do legislativo', '', 'pt-BR', '', 'Y', 'N', '', |
|||
'0'])) |
|||
struct.append('c001q006') |
|||
lsf.writerow(normalize(['1007', '', 'Q', 'T', 'c001q007', '1', |
|||
u'Endereço', '', 'pt-BR', '', 'N', 'N', '', '0'])) |
|||
struct.append('c001q007') |
|||
lsf.writerow(normalize(['1008', '', 'Q', 'S', 'c001q008', '1', |
|||
u'CNPJ', '', 'pt-BR', '', 'N', 'N', '', '0'])) |
|||
struct.append('c001q008') |
|||
lsf.writerow(normalize(['1009', '', 'Q', 'S', 'c001q009', '1', |
|||
u'E-mail principal', '', 'pt-BR', '', 'N', 'N', '', '0'])) |
|||
struct.append('c001q009') |
|||
lsf.writerow(normalize(['1010', '', 'Q', 'S', 'c001q010', '1', |
|||
u'Endereço Web', '', 'pt-BR', '', 'N', 'N', '', '0'])) |
|||
struct.append('c001q010') |
|||
lsf.writerow(normalize(['1011', '', 'Q', ';', 'c001q011', '1', |
|||
u'Pessoas de contato', '', 'pt-BR', '', 'N', 'N', '', '0'])) |
|||
lsf.writerow(normalize(['101198', '', 'SQ', '1', 'SQ00101', '', u'Nome', |
|||
'', 'pt-BR', '', '', 'N', '', '0'])) |
|||
lsf.writerow(normalize(['101199', '', 'SQ', '1', 'SQ00102', '', |
|||
u'E-mail', '', 'pt-BR', '', '', 'N', '', '0'])) |
|||
for i, k, v in setores: |
|||
lsf.writerow(normalize(['10110{0}'.format(i), '', 'SQ', '', |
|||
'SQ1010{0}'.format(i), '1', v, '', 'pt-BR', '', '', 'N', |
|||
'', '0'])) |
|||
struct.extend([ |
|||
'c001q011_SQ1010{0}_SQ00101'.format(i), |
|||
'c001q011_SQ1010{0}_SQ00102'.format(i), |
|||
]) |
|||
|
|||
self.stdout.write("Done!") |
|||
# Equipe de diagnóstico # |
|||
self.stdout.write("\tEquipe de diagnóstico...", ending=" ") |
|||
lsf.writerow(normalize(['2000', '', 'G', '', u'Equipe de diagnóstico', |
|||
'', '', '', 'pt-BR'])) |
|||
lsf.writerow(normalize(['2001', '', 'Q', 'D', 'c002q001', '1', |
|||
u'Data de início da visita', '', 'pt-BR', '', 'Y', 'N', '', '0'])) |
|||
struct.append('c002q001') |
|||
lsf.writerow(normalize(['2002', '', 'Q', 'D', 'c002q002', '1', |
|||
u'Data de término da visita', '', 'pt-BR', '', 'Y', 'N', '', '0'])) |
|||
struct.append('c002q002') |
|||
lsf.writerow(normalize(['2003', '', 'Q', 'S', 'c002q003', '1', |
|||
u'Líder da equipe', '', 'pt-BR', '', 'Y', 'N', '', '0'])) |
|||
struct.append('c002q003') |
|||
lsf.writerow(normalize(['2004', '', 'Q', 'T', 'c002q004', '1', |
|||
u'Membros da equipe', '', 'pt-BR', '', 'Y', 'N', '', '0'])) |
|||
struct.append('c002q004') |
|||
self.stdout.write("Done!") |
|||
|
|||
for c in Categoria.objects.all(): |
|||
self.stdout.write("\t{0}...".format(nonum(c.nome).encode('utf-8')), ending=" ") |
|||
lsf.writerow(normalize([str(c.id), '', 'G', '', |
|||
nonum(c.nome), '', nonum(c.nome), '', |
|||
'pt-BR'])) |
|||
perguntas = sorted([(p.title, p) for p in c.perguntas.all()]) |
|||
for t, p in perguntas: |
|||
lstype = DATATYPES[p.datatype] |
|||
# Hack para perguntas SIM/NÃO que foram cadastradas como Choice |
|||
if lstype == 'L': |
|||
if ("".join([e.title for e in p.choices.all()]) in |
|||
[u"SimNão", u"NãoSim"]): |
|||
lstype = 'Y' |
|||
######## |
|||
relevance = "1" |
|||
if p.abre_por.exists(): |
|||
relevance = "(" + " or ".join( |
|||
[u'({sid}X{gid}X{qid}.NAOK == "{value}")'.format( |
|||
sid=survey_id, gid=e.schema.categoria.id, |
|||
qid=e.schema.id, value=avalue(e)) for e in |
|||
p.abre_por.all()]) + ")" |
|||
|
|||
lsf.writerow(normalize([str(p.id), '', 'Q', lstype, |
|||
'c{0:03}q{1:03}'.format(c.id, p.id), relevance, |
|||
nonum(p.title), p.help_text, 'pt-BR', '', 'NY'[p.required], |
|||
'N', '', '0'])) |
|||
if lstype == 'L': |
|||
lsf.writerows([normalize([str(p.id), u'', u'A', u'0', |
|||
str(e.id), u'', e.title, u'', u'pt-BR']) |
|||
for e in p.choices.all()]) |
|||
if lstype == 'M': |
|||
lsf.writerows([normalize([str(p.id*1000+e.id), u'', u'SQ', |
|||
u'', str(e.id), u'1', e.title, u'', u'pt-BR']) |
|||
for e in p.choices.all()]) |
|||
struct.extend(['c{0:03}q{1:03}_{2}'.format(c.id, p.id, |
|||
e.id) for e in p.choices.all()]) |
|||
else: |
|||
struct.extend(['c{0:03}q{1:03}'.format(c.id, p.id)]) |
|||
self.stdout.write("Done!") |
|||
|
|||
if len(args) < 3: # No data export |
|||
return |
|||
|
|||
self.stdout.write("Exporting survey data: ") |
|||
|
|||
dtf = csv.writer(open(args[2], 'wb+'), delimiter='\t', |
|||
quoting=csv.QUOTE_MINIMAL) |
|||
|
|||
dtf.writerow(struct) |
|||
|
|||
for d in Diagnostico.objects.all(): |
|||
self.stdout.write(u"\t{0}".format(d.casa_legislativa.nome)) |
|||
|
|||
form = OrderedDict.fromkeys(struct, '{question_not_shown}') |
|||
|
|||
form['id'] = str(d.id) |
|||
if d.data_publicacao: |
|||
form['submitdate'] = d.data_publicacao.isoformat() |
|||
# form['lastpage'] = '8' |
|||
form['startlanguage'] = 'pt-BR' |
|||
# form['seed'] = '123456' |
|||
|
|||
# Identificação da Casa Legislativa e sua equipe # |
|||
form['c001q001'] = d.casa_legislativa.municipio.uf.regiao |
|||
form['c001q002'] = d.casa_legislativa.municipio.uf.sigla |
|||
form['c001q003'] = d.casa_legislativa.municipio.nome |
|||
if d.casa_legislativa.municipio.data_criacao: |
|||
form['c001q004'] = \ |
|||
d.casa_legislativa.municipio.data_criacao.isoformat() |
|||
form['c001q005'] = d.casa_legislativa.nome |
|||
if d.casa_legislativa.data_instalacao: |
|||
form['c001q006'] = \ |
|||
d.casa_legislativa.data_instalacao.isoformat() |
|||
form['c001q007'] = ( |
|||
u"{logradouro}{{cr}}{{newline}}" |
|||
u"{bairro}{{cr}}{{newline}}" |
|||
u"{cep} - {municipio} - {uf}".format( |
|||
logradouro=d.casa_legislativa.logradouro, |
|||
bairro=d.casa_legislativa.bairro, |
|||
cep=d.casa_legislativa.cep, |
|||
municipio=d.casa_legislativa.municipio.nome, |
|||
uf=d.casa_legislativa.municipio.uf.sigla |
|||
)) |
|||
form['c001q008'] = d.casa_legislativa.cnpj |
|||
form['c001q009'] = d.casa_legislativa.email |
|||
form['c001q010'] = d.casa_legislativa.pagina_web |
|||
|
|||
for i, k, v in setores: |
|||
q = d.casa_legislativa.funcionario_set.filter(setor=k) |
|||
if q.exists(): |
|||
f = q.first() |
|||
knome = 'c001q011_SQ1010{0}_SQ00101'.format(i) |
|||
kmail = 'c001q011_SQ1010{0}_SQ00102'.format(i) |
|||
form[knome] = f.nome |
|||
form[kmail] = f.email |
|||
|
|||
if d.data_visita_inicio: |
|||
form['c002q001'] = d.data_visita_inicio.isoformat() |
|||
if d.data_visita_fim: |
|||
form['c002q002'] = d.data_visita_fim.isoformat() |
|||
form['c002q003'] = d.responsavel.nome_completo |
|||
form['c002q004'] = "{cr}{newline}".join( |
|||
[e.membro.nome_completo for e in d.equipe_set.all()]) |
|||
|
|||
for r in Resposta.objects.filter(entity_id=d.id): |
|||
if r.schema.datatype == 'many': |
|||
key = "c{cid:03}q{qid:03}_{sqid}".format( |
|||
cid=r.schema.categoria.id, |
|||
qid=r.schema.id, |
|||
sqid=r.value.id |
|||
) |
|||
value = 'Y' |
|||
else: |
|||
key = "c{cid:03}q{qid:03}".format(cid=r.schema.categoria.id, |
|||
qid=r.schema.id) |
|||
value = r.value |
|||
if r.schema.datatype == 'one': |
|||
if value is None: |
|||
value = '{question_not_shown}' |
|||
elif value.title == u'Sim': |
|||
value = 'Y' |
|||
elif value.title == u'Não': |
|||
value = 'N' |
|||
else: |
|||
value = r.value.id |
|||
elif r.schema.datatype == 'text': |
|||
value = value.\ |
|||
replace('\r\n', '{cr}{newline}').\ |
|||
replace('\r', '{cr}{newline}').\ |
|||
replace('\n', '{cr}{newline}').\ |
|||
replace('\t', ' ') |
|||
|
|||
if value is None: |
|||
value = '{question_not_shown}' |
|||
form[key] = u'{0}'.format(value) |
|||
dtf.writerow(normalize(form.values())) |
|||
|
|||
self.stdout.write('Done!') |
|||
|
|||
|
@ -0,0 +1,20 @@ |
|||
# -*- coding: utf-8 -*- |
|||
from __future__ import unicode_literals |
|||
|
|||
from django.db import models, migrations |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('diagnosticos', '0002_auto_20170407_1024'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.AlterField( |
|||
model_name='escolha', |
|||
name='schema_to_open', |
|||
field=models.ForeignKey(related_name='abre_por', verbose_name='pergunta para abrir', blank=True, to='diagnosticos.Pergunta', null=True), |
|||
preserve_default=True, |
|||
), |
|||
] |
Loading…
Reference in new issue