def report_sem_convenio(request): modo = request.GET.get("modo", None) format = request.GET.get("f", "pdf") sc = sem_convenio() if modo == "H": casas = sc["hospedagem"] titulo = _(u"Casas sem convenio que utilizam algum serviço de hospedagem") elif modo == "R": casas = sc["registro"] titulo = _(u"Casas sem convenio que utilizam somente serviço de registro") else: casas = sc["total"] titulo = _(u"Casas sem convenio que utilizam algum serviço de registro e/ou hospedagem") if format == "csv": response = HttpResponse(content_type="text/csv") response["Content-Disposition"] = "attachment; filename=casas.csv" writer = csv.writer(response) writer.writerow([titulo.encode("utf8")]) writer.writerow([u""]) writer.writerow([u"casa", u"uf", u"gerente", u"serviços".encode("utf8")]) for casa in casas: writer.writerow( [ casa.nome.encode("utf8"), casa.municipio.uf.sigla.encode("utf8"), casa.gerente_contas.nome_completo.encode("utf8"), ( u", ".join( casa.servico_set.filter(data_desativacao__isnull=True).values_list( "tipo_servico__nome", flat=True ) ) ).encode("utf8"), ] ) return response elif format == "json": data = { "titulo": titulo, "casas": [ { "nome": casa.nome, "uf": casa.municipio.uf.sigla, "gerente": casa.gerente_contas.nome_completo, "servicos": list( casa.servico_set.filter(data_desativacao__isnull=True).values_list( "tipo_servico__nome", flat=True ) ), } for casa in casas ], } return JsonResponse(data, safe=False) else: context = {"casas": casas, "titulo": titulo} return render_to_pdf("home/sem_convenio.html", context)
def servidores_por_funcao(request): report = Funcao.objects.values('funcao').annotate(funcao__count=Count('funcao')).order_by('funcao__count') total = Funcao.objects.count() context = RequestContext(request, { 'pagesize':'A4', 'report': report, 'total': total }) return render_to_pdf('servidores/servidores_por_funcao.html', context)
def servidores_por_cargo(request): report = Funcao.objects.values('cargo').annotate(cargo__count=Count('cargo')).order_by('cargo__count') total = Funcao.objects.count() context = RequestContext(request, { 'pagesize': 'A4', 'report': report, 'total': total }) return render_to_pdf('servidores/servidores_por_cargo.html', context)
def map_list(request): # Filtrar Casas de acordo com os parâmetros param = get_params(request) formato = request.GET.get('fmt', 'pdf') casas = filtrar_casas(**param) casas = casas.order_by('municipio__uf__regiao', 'municipio__uf__nome', 'nome').distinct() if formato == 'csv': response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="maplist.csv"' writer = csv.writer(response) srv = {x[0]: x[1] for x in TipoServico.objects.values_list('id', 'nome')} cnv = {x[0]: x[1] for x in Projeto.objects.values_list('id', 'sigla')} head = [s.encode('utf-8') for s in [u'código IBGE', u'nome da casa', u'município', u'UF', u'região', ] + [x for x in srv.values()] + reduce(lambda x, y: x + y, [['conveniada ao %s' % x, 'equipada por %s' % x] for x in cnv.values()])] writer.writerow(head) for casa in casas: row = [casa.municipio.codigo_ibge, casa.nome.encode('utf-8'), casa.municipio.nome.encode('utf-8'), casa.municipio.uf.sigla.encode('utf-8'), casa.municipio.uf.get_regiao_display().encode('utf-8'), ] for id in srv.keys(): try: sv = casa.servico_set.get(tipo_servico__id=id) row += [sv.data_ativacao, ] except: row += [None, ] for id in cnv.keys(): try: cv = casa.convenio_set.get(projeto__id=id) row += [cv.data_retorno_assinatura, cv.data_termo_aceite if cv.equipada else None, ] except: row += [None, None, ] writer.writerow(row) return response return render_to_pdf('metas/map_list.html', {'casas': casas})
def diagnostico_pdf(request, id_diagnostico): diagnostico = Diagnostico.objects.get(pk=id_diagnostico) categorias = Categoria.objects.all() casa_legislativa = diagnostico.casa_legislativa funcionarios = [] for n, l in Funcionario.SETOR_CHOICES: if casa_legislativa.funcionario_set.filter(setor=n).count() <= 1: funcionarios.append(casa_legislativa.funcionario_set.get_or_create(setor=n)) else: for f in casa_legislativa.funcionario_set.filter(setor=n): funcionarios.append(f) schemas_by_categoria = [] for categoria in categorias: schemas = [] for schema in diagnostico.get_schemata(categoria.id): datatype = schema.datatype data = getattr(diagnostico, schema.name) if datatype == schema.TYPE_MANY: schema.value = [x.pk for x in data] elif datatype == schema.TYPE_ONE: schema.value = (data.pk if data else None,) else: schema.value = data schemas.append(schema) schemas_by_categoria.append((categoria, schemas)) context = RequestContext( request, { "pagesize": "A4", "casa_legislativa": casa_legislativa, "funcionarios": funcionarios, "diagnostico": diagnostico, "schemas_by_categoria": schemas_by_categoria, }, ) return render_to_pdf("diagnosticos/diagnostico_pdf.html", context)
def diagnostico_pdf(request, id_diagnostico): diagnostico = Diagnostico.objects.get(pk=id_diagnostico) categorias = Categoria.objects.all() casa_legislativa = diagnostico.casa_legislativa funcionarios = [] for n, l in Funcionario.SETOR_CHOICES: if casa_legislativa.funcionario_set.filter(setor=n).count() <= 1: funcionarios.append( casa_legislativa.funcionario_set.get_or_create(setor=n)) else: for f in casa_legislativa.funcionario_set.filter(setor=n): funcionarios.append(f) schemas_by_categoria = [] for categoria in categorias: schemas = [] for schema in diagnostico.get_schemata(categoria.id): datatype = schema.datatype data = getattr(diagnostico, schema.name) if datatype == schema.TYPE_MANY: schema.value = [x.pk for x in data] elif datatype == schema.TYPE_ONE: schema.value = data.pk if data else None, else: schema.value = data schemas.append(schema) schemas_by_categoria.append((categoria, schemas)) context = RequestContext( request, { 'pagesize': 'A4', 'casa_legislativa': casa_legislativa, 'funcionarios': funcionarios, 'diagnostico': diagnostico, 'schemas_by_categoria': schemas_by_categoria, }) return render_to_pdf('diagnosticos/diagnostico_pdf.html', context)
def calendario(request): mes_pesquisa = int(request.GET.get('mes', datetime.date.today().month)) ano_pesquisa = int(request.GET.get('ano', datetime.date.today().year)) formato = request.GET.get('fmt', 'html') dia1 = datetime.date(ano_pesquisa, mes_pesquisa, 1) mes_anterior = dia1 - datetime.timedelta(days=1) mes_seguinte = dia1.replace(day=28) + datetime.timedelta( days=4) # Ugly hack mes_seguinte = mes_seguinte.replace(day=1) data = {'mes_pesquisa': mes_pesquisa, 'ano_pesquisa': ano_pesquisa} if Evento.objects.filter(data_inicio__year=mes_anterior.year, data_inicio__month=mes_anterior.month).exists(): data['prev_button'] = { 'mes': mes_anterior.month, 'ano': mes_anterior.year } if Evento.objects.filter(data_inicio__year=mes_seguinte.year, data_inicio__month=mes_seguinte.month).exists(): data['next_button'] = { 'mes': mes_seguinte.month, 'ano': mes_seguinte.year } c = calendar.Calendar(6) dates = reduce(lambda x, y: x + y, c.monthdatescalendar(ano_pesquisa, mes_pesquisa)) eventos = [] for evento in Evento.objects.filter( data_inicio__year=ano_pesquisa, data_inicio__month=mes_pesquisa).order_by('data_inicio'): start = dates.index(evento.data_inicio) if not evento.data_termino in dates: lastday = dates[-1] while lastday < evento.data_termino: lastday = lastday + datetime.timedelta(days=1) dates.append(lastday) eventos.append({'evento': evento, 'start': start}) # Calcula a distância dos eventos para as bordas do calendário for evento in eventos: end = dates.index(evento['evento'].data_termino) evento['duration'] = end - evento['start'] + 1 evento['close'] = len(dates) - end - 1 # Agrupa os eventos em linhas para melhorar a visualização linhas = [] for evento in eventos: encaixado = False for linha in linhas: sobrepoe = False for e in linha: if (( (evento['evento'].data_inicio >= e['evento'].data_inicio) and (evento['evento'].data_inicio <= e['evento'].data_termino)) or ((evento['evento'].data_termino >= e['evento'].data_inicio) and (evento['evento'].data_termino <= e['evento'].data_termino))): sobrepoe = True break if not sobrepoe: # Adiona o evento em uma linha que ele não sobrepoe nenhum outro linha.append(evento) encaixado = True break if not encaixado: # Adiciona uma nova linha porque este evento não se encaixa em nenhuma existente linhas.append([evento]) # Recalcula as distâncias dos eventos por linha para encaixar no calendário for linha in linhas: anterior = None for evento in linha: if anterior is None: anterior = evento continue anterior['close'] = (evento['evento'].data_inicio - anterior['evento'].data_termino).days - 1 evento['start'] = 0 anterior = evento data['dates'] = dates data['eventos'] = eventos data['linhas'] = linhas if formato == 'pdf': return render_to_pdf('eventos/calendario_pdf.html', data) return render(request, 'eventos/calendario.html', data)
def alocacao_equipe(request): ano_pesquisa = int(request.GET.get('ano', datetime.date.today().year)) formato = request.GET.get('fmt', 'html') data = {'ano_pesquisa': ano_pesquisa} if Evento.objects.filter(data_inicio__year=ano_pesquisa - 1).exists(): data['prev_button'] = {'ano': ano_pesquisa - 1} if Evento.objects.filter(data_inicio__year=ano_pesquisa + 1).exists(): data['next_button'] = {'ano': ano_pesquisa + 1} dados = [] for evento in Evento.objects.filter( data_inicio__year=ano_pesquisa).exclude( status='C').prefetch_related('equipe_set'): for p in evento.equipe_set.all(): registro = None for r in dados: if r[0] == p.membro.pk: registro = r break if not registro: registro = [ p.membro.pk, p.membro.nome_completo, [{ 'dias': 0, 'eventos': 0 } for x in range(1, 13)] ] dados.append(registro) registro[2][evento.data_inicio.month - 1]['dias'] += (evento.data_termino - evento.data_inicio).days + 1 registro[2][evento.data_inicio.month - 1]['eventos'] += 1 dados.sort(lambda x, y: cmp(x[1], y[1])) lang = (translation.to_locale(translation.get_language()) + '.utf8').encode() locale.setlocale(locale.LC_ALL, lang) meses = [calendar.month_name[m] for m in range(1, 13)] linhas = [[_(u"Servidor")] + meses + ['total']] for r in dados: r[2].append( reduce( lambda x, y: { 'dias': x['dias'] + y['dias'], 'eventos': x['eventos'] + y['eventos'] }, r[2])) linhas.append([r[1]] + [ _( ungettext(u"%(dias)s dia", u"%(dias)s dias", d['dias']) + " em " + ungettext(u"%(eventos)s evento", u"%(eventos)s eventos", d['eventos'])) % d if d['dias'] > 0 or d['eventos'] > 0 else '' for d in r[2] ]) # for registro in Servidor.objects.filter(equipe_evento__evento__data_inicio__year=ano_pesquisa).exclude(equipe_evento__evento__status='C').distinct(): # dados = [{'dias': 0, 'eventos': 0} for x in range(1,13)] # for part in registro.equipe_evento.filter(evento__data_inicio__year=ano_pesquisa).exclude(evento__status='C'): # dados[part.evento.data_inicio.month-1]['dias'] += (part.evento.data_termino - # part.evento.data_inicio).days + 1 # dados[part.evento.data_inicio.month-1]['eventos'] += 1 # dados.append([registro.nome_completo] + [_(ungettext(u"%(dias)s dia", u"%(dias)s dias", d['dias']) + " em " + ungettext(u"%(eventos)s evento", u"%(eventos)s eventos", d['eventos'])) % d if d['dias'] > 0 or d['eventos'] > 0 else '' for d in dados]) data['linhas'] = linhas if formato == 'pdf': return render_to_pdf('eventos/alocacao_equipe_pdf.html', data) elif formato == 'csv': response = HttpResponse(content_type='text/csv') response[ 'Content-Disposition'] = 'attachment; filename="alocacao_equipe_%s.csv"' % ( ano_pesquisa, ) writer = csv.writer(response) asc_list = [[ s.encode('utf-8') if isinstance(s, unicode) else s for s in l ] for l in linhas] writer.writerows(asc_list) return response elif formato == 'json': result = { 'ano': ano_pesquisa, 'equipe': [{ 'pk': d[0], 'nome_completo': d[1], 'meses': {m[0]: m[1] for m in zip(meses + ['total'], d[2])} } for d in dados] } return JsonResponse(result) return render(request, 'eventos/alocacao_equipe.html', data)
def map_sum(request): # Filtrar Casas de acordo com os parâmetros param = get_params(request) casas = filtrar_casas(**param) # Montar registros de totalização tot_servicos = SortedDict() tot_projetos = SortedDict() tot_diagnosticos = SortedDict() for ts in TipoServico.objects.all(): tot_servicos[ts.sigla] = 0 for pr in Projeto.objects.all(): tot_projetos[pr.sigla] = 0 tot_convenios = tot_projetos.copy() tot_equipadas = tot_projetos.copy() tot_diagnosticos['A'] = 0 tot_diagnosticos['P'] = 0 # Montar as linhas do array de resultados com as regiões e os estados result = {} for uf in UnidadeFederativa.objects.filter(Q(regiao__in=param['regioes']) | Q(sigla__in=param['estados'])).order_by('regiao', 'nome'): if uf.regiao not in result: result[uf.regiao] = {'nome': uf.get_regiao_display(), 'ufs': {}, 'servicos': tot_servicos.copy(), 'convenios': tot_projetos.copy(), 'equipadas': tot_projetos.copy(), 'diagnosticos': tot_diagnosticos.copy()} result[uf.regiao]['ufs'][uf.codigo_ibge] = {'nome': uf.nome, 'servicos': tot_servicos.copy(), 'convenios': tot_projetos.copy(), 'equipadas': tot_projetos.copy(), 'diagnosticos': tot_diagnosticos.copy()} # Processar as casas filtradas for casa in casas.distinct(): uf = casa.municipio.uf for s in casa.servico_set.all(): tot_servicos[s.tipo_servico.sigla] += 1 result[uf.regiao]['servicos'][s.tipo_servico.sigla] += 1 result[uf.regiao]['ufs'][uf.codigo_ibge]['servicos'][s.tipo_servico.sigla] += 1 for c in casa.convenio_set.all(): tot_convenios[c.projeto.sigla] += 1 result[uf.regiao]['convenios'][c.projeto.sigla] += 1 result[uf.regiao]['ufs'][uf.codigo_ibge]['convenios'][c.projeto.sigla] += 1 if (c.equipada and c.data_termo_aceite is not None): tot_equipadas[c.projeto.sigla] += 1 result[uf.regiao]['equipadas'][c.projeto.sigla] += 1 result[uf.regiao]['ufs'][uf.codigo_ibge]['equipadas'][c.projeto.sigla] += 1 for d in casa.diagnostico_set.all(): if d.publicado: tot_diagnosticos['P'] += 1 result[uf.regiao]['diagnosticos']['P'] += 1 result[uf.regiao]['ufs'][uf.codigo_ibge]['diagnosticos']['P'] += 1 else: tot_diagnosticos['A'] += 1 result[uf.regiao]['diagnosticos']['A'] += 1 result[uf.regiao]['ufs'][uf.codigo_ibge]['diagnosticos']['A'] += 1 extra_context = { 'pagesize': 'a4 landscape', 'servicos': TipoServico.objects.all(), 'projetos': Projeto.objects.all(), 'result': result, 'tot_servicos': tot_servicos, 'tot_convenios': tot_convenios, 'tot_equipadas': tot_equipadas, 'tot_diagnosticos': tot_diagnosticos, } return render_to_pdf('metas/map_sum.html', extra_context)
def map_list(request): # Filtrar Casas de acordo com os parâmetros param = get_params(request) formato = request.GET.get('fmt', 'pdf') casas = filtrar_casas(**param) casas = casas.order_by('municipio__uf__regiao', 'municipio__uf__nome', 'nome').distinct() if formato == 'csv': response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="maplist.csv"' writer = csv.writer(response) srv = { x[0]: x[1] for x in TipoServico.objects.values_list('id', 'nome') } cnv = {x[0]: x[1] for x in Projeto.objects.values_list('id', 'sigla')} head = [ s.encode('utf-8') for s in [ u'código IBGE', u'nome da casa', u'município', u'UF', u'região', ] + [x for x in srv.values()] + reduce(lambda x, y: x + y, [['conveniada ao %s' % x, 'equipada por %s' % x] for x in cnv.values()]) ] writer.writerow(head) for casa in casas: row = [ casa.municipio.codigo_ibge, casa.nome.encode('utf-8'), casa.municipio.nome.encode('utf-8'), casa.municipio.uf.sigla.encode('utf-8'), casa.municipio.uf.get_regiao_display().encode('utf-8'), ] for id in srv.keys(): try: sv = casa.servico_set.get(tipo_servico__id=id) row += [ sv.data_ativacao, ] except: row += [ None, ] for id in cnv.keys(): try: cv = casa.convenio_set.get(projeto__id=id) row += [ cv.data_retorno_assinatura, cv.data_termo_aceite if cv.equipada else None, ] except: row += [ None, None, ] writer.writerow(row) return response return render_to_pdf('metas/map_list.html', {'casas': casas})
def map_sum(request): # Filtrar Casas de acordo com os parâmetros param = get_params(request) casas = filtrar_casas(**param) # Montar registros de totalização tot_servicos = SortedDict() tot_projetos = SortedDict() tot_diagnosticos = SortedDict() for ts in TipoServico.objects.all(): tot_servicos[ts.sigla] = 0 for pr in Projeto.objects.all(): tot_projetos[pr.sigla] = 0 tot_convenios = tot_projetos.copy() tot_equipadas = tot_projetos.copy() tot_diagnosticos['A'] = 0 tot_diagnosticos['P'] = 0 # Montar as linhas do array de resultados com as regiões e os estados result = {} for uf in UnidadeFederativa.objects.filter( Q(regiao__in=param['regioes']) | Q(sigla__in=param['estados'])).order_by('regiao', 'nome'): if uf.regiao not in result: result[uf.regiao] = { 'nome': uf.get_regiao_display(), 'ufs': {}, 'servicos': tot_servicos.copy(), 'convenios': tot_projetos.copy(), 'equipadas': tot_projetos.copy(), 'diagnosticos': tot_diagnosticos.copy() } result[uf.regiao]['ufs'][uf.codigo_ibge] = { 'nome': uf.nome, 'servicos': tot_servicos.copy(), 'convenios': tot_projetos.copy(), 'equipadas': tot_projetos.copy(), 'diagnosticos': tot_diagnosticos.copy() } # Processar as casas filtradas for casa in casas.distinct(): uf = casa.municipio.uf for s in casa.servico_set.all(): tot_servicos[s.tipo_servico.sigla] += 1 result[uf.regiao]['servicos'][s.tipo_servico.sigla] += 1 result[uf.regiao]['ufs'][uf.codigo_ibge]['servicos'][ s.tipo_servico.sigla] += 1 for c in casa.convenio_set.all(): tot_convenios[c.projeto.sigla] += 1 result[uf.regiao]['convenios'][c.projeto.sigla] += 1 result[uf.regiao]['ufs'][uf.codigo_ibge]['convenios'][ c.projeto.sigla] += 1 if (c.equipada and c.data_termo_aceite is not None): tot_equipadas[c.projeto.sigla] += 1 result[uf.regiao]['equipadas'][c.projeto.sigla] += 1 result[uf.regiao]['ufs'][uf.codigo_ibge]['equipadas'][ c.projeto.sigla] += 1 for d in casa.diagnostico_set.all(): if d.publicado: tot_diagnosticos['P'] += 1 result[uf.regiao]['diagnosticos']['P'] += 1 result[uf.regiao]['ufs'][ uf.codigo_ibge]['diagnosticos']['P'] += 1 else: tot_diagnosticos['A'] += 1 result[uf.regiao]['diagnosticos']['A'] += 1 result[uf.regiao]['ufs'][ uf.codigo_ibge]['diagnosticos']['A'] += 1 extra_context = { 'pagesize': 'a4 landscape', 'servicos': TipoServico.objects.all(), 'projetos': Projeto.objects.all(), 'result': result, 'tot_servicos': tot_servicos, 'tot_convenios': tot_convenios, 'tot_equipadas': tot_equipadas, 'tot_diagnosticos': tot_diagnosticos, } return render_to_pdf('metas/map_sum.html', extra_context)
def calendario(request): mes_pesquisa = int(request.GET.get('mes', datetime.date.today().month)) ano_pesquisa = int(request.GET.get('ano', datetime.date.today().year)) formato = request.GET.get('fmt', 'html') dia1 = datetime.date(ano_pesquisa, mes_pesquisa, 1) mes_anterior = dia1 - datetime.timedelta(days=1) mes_seguinte = dia1.replace(day=28) + datetime.timedelta(days=4) # Ugly hack mes_seguinte = mes_seguinte.replace(day=1) data = {'mes_pesquisa': mes_pesquisa, 'ano_pesquisa': ano_pesquisa} if Evento.objects.filter(data_inicio__year=mes_anterior.year, data_inicio__month=mes_anterior.month).exists(): data['prev_button'] = {'mes': mes_anterior.month, 'ano': mes_anterior.year } if Evento.objects.filter(data_inicio__year=mes_seguinte.year, data_inicio__month=mes_seguinte.month).exists(): data['next_button'] = {'mes': mes_seguinte.month, 'ano': mes_seguinte.year } c = calendar.Calendar(6) dates = reduce(lambda x,y: x+y, c.monthdatescalendar(ano_pesquisa, mes_pesquisa)) eventos = [] for evento in Evento.objects.filter(data_inicio__year=ano_pesquisa, data_inicio__month=mes_pesquisa).order_by('data_inicio'): start = dates.index(evento.data_inicio) if not evento.data_termino in dates: lastday = dates[-1] while lastday < evento.data_termino: lastday = lastday + datetime.timedelta(days=1) dates.append(lastday) eventos.append({'evento': evento, 'start': start}) # Calcula a distância dos eventos para as bordas do calendário for evento in eventos: end = dates.index(evento['evento'].data_termino) evento['duration'] = end-evento['start']+1 evento['close'] = len(dates)-end-1 # Agrupa os eventos em linhas para melhorar a visualização linhas = [] for evento in eventos: encaixado = False for linha in linhas: sobrepoe = False for e in linha: if (((evento['evento'].data_inicio >= e['evento'].data_inicio) and (evento['evento'].data_inicio <= e['evento'].data_termino)) or ((evento['evento'].data_termino >= e['evento'].data_inicio) and (evento['evento'].data_termino <= e['evento'].data_termino))): sobrepoe = True break if not sobrepoe: # Adiona o evento em uma linha que ele não sobrepoe nenhum outro linha.append(evento) encaixado = True break if not encaixado: # Adiciona uma nova linha porque este evento não se encaixa em nenhuma existente linhas.append([evento]) # Recalcula as distâncias dos eventos por linha para encaixar no calendário for linha in linhas: anterior = None for evento in linha: if anterior is None: anterior = evento continue anterior['close'] = (evento['evento'].data_inicio - anterior['evento'].data_termino).days-1 evento['start'] = 0 anterior = evento data['dates'] = dates data['eventos'] = eventos data['linhas'] = linhas if formato == 'pdf': return render_to_pdf('eventos/calendario_pdf.html', data ) return render(request, 'eventos/calendario.html', data)
def alocacao_equipe(request): ano_pesquisa = int(request.GET.get('ano', datetime.date.today().year)) formato = request.GET.get('fmt', 'html') data = {'ano_pesquisa': ano_pesquisa} if Evento.objects.filter(data_inicio__year=ano_pesquisa-1).exists(): data['prev_button'] = {'ano': ano_pesquisa - 1 } if Evento.objects.filter(data_inicio__year=ano_pesquisa+1).exists(): data['next_button'] = {'ano': ano_pesquisa + 1 } dados = [] for evento in Evento.objects.filter(data_inicio__year=ano_pesquisa).exclude(status='C').prefetch_related('equipe_set'): for p in evento.equipe_set.all(): registro = None for r in dados: if r[0] == p.membro.pk: registro = r break if not registro: registro = [p.membro.pk, p.membro.nome_completo, [{'dias': 0, 'eventos': 0} for x in range(1,13)]] dados.append(registro) registro[2][evento.data_inicio.month-1]['dias'] += (evento.data_termino - evento.data_inicio).days + 1 registro[2][evento.data_inicio.month-1]['eventos'] += 1 dados.sort(lambda x, y: cmp(x[1], y[1])) lang = (translation.to_locale(translation.get_language())+'.utf8').encode() locale.setlocale(locale.LC_ALL, lang) meses = [calendar.month_name[m] for m in range(1,13)] linhas = [[_(u"Servidor")] + meses + ['total']] for r in dados: r[2].append(reduce(lambda x,y:{'dias': x['dias'] + y['dias'], 'eventos': x['eventos'] + y['eventos']}, r[2])) linhas.append([r[1]] + [_(ungettext(u"%(dias)s dia", u"%(dias)s dias", d['dias']) + " em " + ungettext(u"%(eventos)s evento", u"%(eventos)s eventos", d['eventos']) ) % d if d['dias'] > 0 or d['eventos'] > 0 else '' for d in r[2]]) # for registro in Servidor.objects.filter(equipe_evento__evento__data_inicio__year=ano_pesquisa).exclude(equipe_evento__evento__status='C').distinct(): # dados = [{'dias': 0, 'eventos': 0} for x in range(1,13)] # for part in registro.equipe_evento.filter(evento__data_inicio__year=ano_pesquisa).exclude(evento__status='C'): # dados[part.evento.data_inicio.month-1]['dias'] += (part.evento.data_termino - # part.evento.data_inicio).days + 1 # dados[part.evento.data_inicio.month-1]['eventos'] += 1 # dados.append([registro.nome_completo] + [_(ungettext(u"%(dias)s dia", u"%(dias)s dias", d['dias']) + " em " + ungettext(u"%(eventos)s evento", u"%(eventos)s eventos", d['eventos'])) % d if d['dias'] > 0 or d['eventos'] > 0 else '' for d in dados]) data['linhas'] = linhas if formato == 'pdf': return render_to_pdf('eventos/alocacao_equipe_pdf.html', data) elif formato == 'csv': response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="alocacao_equipe_%s.csv"' % (ano_pesquisa,) writer = csv.writer(response) asc_list = [[s.encode('utf-8') if isinstance(s, unicode) else s for s in l] for l in linhas] writer.writerows(asc_list) return response elif formato == 'json': result = {'ano': ano_pesquisa, 'equipe': [{'pk': d[0], 'nome_completo': d[1], 'meses': {m[0]: m[1] for m in zip(meses+['total'], d[2])} } for d in dados]} return JsonResponse(result) return render(request, 'eventos/alocacao_equipe.html', data)
def report_sem_convenio(request): modo = request.GET.get('modo', None) format = request.GET.get('f', 'pdf') sc = sem_convenio() if modo == 'H': casas = sc['hospedagem'] titulo = _( u"Casas sem convenio que utilizam algum serviço de hospedagem") elif modo == 'R': casas = sc['registro'] titulo = _( u"Casas sem convenio que utilizam somente serviço de registro") else: casas = sc['total'] titulo = _( u"Casas sem convenio que utilizam algum serviço de registro e/ou hospedagem" ) if format == 'csv': response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename=casas.csv' writer = csv.writer(response) writer.writerow([titulo.encode('utf8')]) writer.writerow([u'']) writer.writerow( [u'casa', u'uf', u'gerente', u'serviços'.encode('utf8')]) for casa in casas: writer.writerow([ casa.nome.encode('utf8'), casa.municipio.uf.sigla.encode('utf8'), casa.gerente_contas.nome_completo.encode('utf8'), (u', '.join( casa.servico_set.filter( data_desativacao__isnull=True).values_list( 'tipo_servico__nome', flat=True))).encode('utf8'), ]) return response elif format == 'json': data = { 'titulo': titulo, 'casas': [{ 'nome': casa.nome, 'uf': casa.municipio.uf.sigla, 'gerente': casa.gerente_contas.nome_completo, 'servicos': list( casa.servico_set.filter( data_desativacao__isnull=True).values_list( 'tipo_servico__nome', flat=True)) } for casa in casas] } return JsonResponse(data, safe=False) else: context = {'casas': casas, 'titulo': titulo} return render_to_pdf('home/sem_convenio.html', context)