示例#1
0
文件: views.py 项目: interlegis/sigi
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)
示例#2
0
文件: views.py 项目: brenotx/SIGI-1.6
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)
示例#3
0
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)
示例#4
0
文件: views.py 项目: interlegis/sigi
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})
示例#5
0
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)
示例#6
0
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)
示例#7
0
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)
示例#8
0
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)
示例#9
0
文件: views.py 项目: jhgouveia/sigi
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)
示例#10
0
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})
示例#11
0
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)
示例#12
0
文件: views.py 项目: interlegis/sigi
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)
示例#13
0
文件: views.py 项目: interlegis/sigi
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)
示例#14
0
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)