# -*- encoding: utf -*_-8
# Create your views here.
from django.http import HttpResponse
from django.template import RequestContext
from django.shortcuts import render_to_response
from dateutil.relativedelta import relativedelta
from reservas_abm.models import *
import django_tables as tables
import datetime
import xlwt
from types import *
from decimal import Decimal
from number_to_letter import *

def import_xls(request):
    c = RequestContext(request, {'other_context':'details here'})
    if request.method == 'POST': # If the form has been submitted...
        form = ImportExcelForm(request.POST,  request.FILES) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            excel_parser= ExcelParser()
            success, log  = excel_parser.read_excel(request.FILES['file'] )
            if success:
                return redirect(reverse('admin:index') + "pages/flowcell_good/") ## redirects to aliquot page ordered by the most recent
            else:
                errors = '* Problem with flowcell * <br><br>log details below:<br>' + "<br>".join(log)
                c['errors'] = mark_safe(errors)
        else:
            c['errors'] = form.errors
    else:
        form = ImportExcelForm() # An unbound form
    c['form'] = form
    return render_to_response('sequencing/file_upload.html')

def recibo(request, recibo_id):
    recibo_view = Recibo.objects.get(pk=recibo_id)
    params = request.GET.copy()
    url = '%s?%s' % (request.path, params.urlencode())

    items_concepto = []
    importe_concepto = []
    items_formadepago = []
    fecha_formadepago = []
    importe_formadepago = []
    interes_formadepago = []

    nro_recibo_pago=recibo_view.nro_recibo_pago
    fecha_recibo=recibo_view.fecha_recibo
    socio=recibo_view.socio
    nro_contrato=recibo_view.nro_contrato
    ownerid=recibo_view.ownerid
    direccion=recibo_view.direccion
    cuit=recibo_view.cuit
    recibimos_suma=recibo_view.recibimos_suma
    tipo_cambio=recibo_view.tipo_cambio
    importe_aplicado=recibo_view.importe_aplicado
    usuario=recibo_view.daily.usuario

    for items_transactions in recibo_view.daily.detalletransaction_set.all():
        if not items_transactions.transaction_codeid == None:
            if items_transactions.importe_usd > 0:
                items_concepto.append(str(items_transactions.transaction_codeid.descripcion)
                + ' (U$D ' + str(items_transactions.importe_usd) + ')')
                importe_concepto.append('U$D ' + str(items_transactions.importe_usd))
            else:
                items_concepto.append(str(items_transactions.transaction_codeid.descripcion))
                importe_concepto.append('$ ' + str(items_transactions.importe_pesos))
        else:
            if items_transactions.importe_usd > 0:
                items_concepto.append(str('F ' + items_transactions.nro_folio)
                + ' (U$D ' + str(items_transactions.importe_usd) + ')')
                importe_concepto.append('U$D ' + str(items_transactions.importe_usd))
            else:
                items_concepto.append(str('F ' + items_transactions.nro_folio))
                importe_concepto.append('$ ' + str(items_transactions.importe_pesos))

    importe_aplicado_usd = 0
    for items_instrument in recibo_view.daily.detallepago_set.all():
        items_formadepago.append(str(items_instrument.instrument_id.forma_pago))
        fecha_formadepago.append(items_instrument.fecha_dep)
        if items_instrument.monto_usd > 0:
            importe_formadepago.append('U$D ' + str(items_instrument.monto_usd))
            importe_aplicado_usd += items_instrument.monto_usd
        else:
            importe_formadepago.append('$ ' + str(items_instrument.monto_pesos))
            interes_formadepago.append('$ ' + str(items_instrument.intereses_pesos))

    if 'EFECTIVO USD' in items_formadepago:
        #trxcurrency='Dolares '
        trxcurrency=' '
        importe_en_letras=(to_word(importe_aplicado_usd) + ' Dolares')
        importe_aplicado = ('U$D ' + str(importe_aplicado_usd))
    elif 'DEPOSITO USD' in items_formadepago:
        #trxcurrency='Dolares '
        trxcurrency=' '
        importe_en_letras=(to_word(importe_aplicado_usd) + ' Dolares')
        importe_aplicado = ('U$D ' + str(importe_aplicado_usd))
    else:
        #trxcurrency='Pesos '
        trxcurrency=' '
        importe_en_letras=(to_word(importe_aplicado) + ' Pesos')
        importe_aplicado = ('$ ' + str(importe_aplicado))

    return render_to_response('index_recibo_prod.html', { 'nro_recibo_pago': nro_recibo_pago,
        'fecha_recibo': fecha_recibo, 'socio': socio, 'nro_contrato': nro_contrato,
        'ownerid': ownerid, 'direccion': direccion, 'cuit': cuit, 'recibimos_suma':
        importe_en_letras, 'tipo_cambio': tipo_cambio,'importe_aplicado': importe_aplicado,
        'concepto': items_concepto, 'importe_concepto':importe_concepto, 'trxcurrency': trxcurrency,
        'forma_pago': items_formadepago, 'fecha_dep': fecha_formadepago,
        'importe_formadepago': importe_formadepago, 'interes_formadepago': interes_formadepago,
        'usuario': usuario, 'url': url }, context_instance=RequestContext(request))

def recibocl(request, recibochile_id):
    recibocl_view = ReciboChile.objects.get(pk=recibochile_id)
    params = request.GET.copy()
    url = '%s?%s' % (request.path, params.urlencode())

    items_concepto = []
    importe_concepto = []
    items_formadepago = []
    fecha_formadepago = []
    importe_formadepago = []
    interes_formadepago = []

    nro_recibo_pago=recibocl_view.nro_recibo_pago
    fecha_recibo=recibocl_view.fecha_recibo
    socio=recibocl_view.socio
    nro_contrato=recibocl_view.nro_contrato
    ownerid=recibocl_view.ownerid
    direccion=recibocl_view.direccion
    cuit=recibocl_view.cuit
    recibimos_suma=recibocl_view.recibimos_suma
    tipo_cambio=recibocl_view.tipo_cambio
    importe_aplicado=recibocl_view.importe_aplicado
    usuario=recibocl_view.daily.usuario

    for items_transactions in recibocl_view.daily.detalletransactionchile_set.all():
        if not items_transactions.transaction_codeid == None:
            if items_transactions.importe_usd > 0:
                items_concepto.append(str(items_transactions.transaction_codeid.descripcion)
                + ' (U$D ' + str(items_transactions.importe_usd) + ')')
                importe_concepto.append('U$D ' + str(items_transactions.importe_usd))
            else:
                items_concepto.append(str(items_transactions.transaction_codeid.descripcion))
                importe_concepto.append('$ ' + str(items_transactions.importe_pesos))
        else:
            if items_transactions.importe_usd > 0:
                items_concepto.append(str('F ' + items_transactions.nro_folio)
                + ' (U$D ' + str(items_transactions.importe_usd) + ')')
                importe_concepto.append('U$D ' + str(items_transactions.importe_usd))
            else:
                items_concepto.append(str('F ' + items_transactions.nro_folio))
                importe_concepto.append('$ ' + str(items_transactions.importe_pesos))

    importe_aplicado_usd = 0
    for items_instrument in recibocl_view.daily.detallepagochile_set.all():
        items_formadepago.append(str(items_instrument.instrument_id.forma_pago))
        fecha_formadepago.append(items_instrument.fecha_dep)
        if items_instrument.monto_usd > 0:
            importe_formadepago.append('U$D ' + str(items_instrument.monto_usd))
            importe_aplicado_usd += items_instrument.monto_usd
        else:
            importe_formadepago.append('$ ' + str(items_instrument.monto_pesos))
            interes_formadepago.append('$ ' + str(items_instrument.intereses_pesos))

    if 'EFECTIVO USD' in items_formadepago:
        #trxcurrency='Dolares '
        trxcurrency=' '
        importe_aplicado = ('U$D ' + str(importe_aplicado_usd))
    elif 'DEPOSITO USD' in items_formadepago:
        #trxcurrency='Dolares '
        trxcurrency=' '
        importe_aplicado = ('U$D ' + str(importe_aplicado_usd))
    else:
        #trxcurrency='Pesos '
        trxcurrency=' '
        importe_aplicado = ('$ ' + str(importe_aplicado))

    return render_to_response('index_recibo_chile_prod.html', { 'nro_recibo_pago': nro_recibo_pago,
        'fecha_recibo': fecha_recibo, 'socio': socio, 'nro_contrato': nro_contrato,
        'ownerid': ownerid, 'direccion': direccion, 'cuit': cuit, 'recibimos_suma':
        recibimos_suma, 'tipo_cambio': tipo_cambio,'importe_aplicado': importe_aplicado,
        'concepto': items_concepto, 'importe_concepto':importe_concepto, 'trxcurrency': trxcurrency,
        'forma_pago': items_formadepago, 'fecha_dep': fecha_formadepago,
        'importe_formadepago': importe_formadepago, 'interes_formadepago': interes_formadepago,
        'usuario': usuario, 'url': url }, context_instance=RequestContext(request))

def recibov(request, reciboventa_id):
    recibov_view = ReciboVenta.objects.get(pk=reciboventa_id)
    params = request.GET.copy()
    url = '%s?%s' % (request.path, params.urlencode())

    items_concepto = []
    importe_concepto = []
    items_formadepago = []
    fecha_formadepago = []
    importe_formadepago = []
    interes_formadepago = []

    nro_recibo_pago=recibov_view.nro_recibo_pago_venta
    fecha_recibo=recibov_view.fecha_recibo_venta
    socio=recibov_view.socio
    nro_contrato=recibov_view.nro_contrato
    ownerid=recibov_view.ownerid
    direccion=recibov_view.direccion
    cuit=recibov_view.cuit
    recibimos_suma=recibov_view.recibimos_suma
    tipo_cambio=recibov_view.tipo_cambio
    importe_aplicado=recibov_view.importe_aplicado
    usuario=recibov_view.daily_venta.usuario

    for items_transactions in recibov_view.daily_venta.detalletransactionventa_set.all():
        if not items_transactions.transaction_codeid == None:
            if items_transactions.importe_usd > 0:
                items_concepto.append(str(items_transactions.transaction_codeid.descripcion)
                + ' (usd ' + str(items_transactions.importe_usd) + ')')
            else:
                items_concepto.append(str(items_transactions.transaction_codeid.descripcion))
        else:
            if items_transactions.importe_usd > 0:
                items_concepto.append(str('F ' + items_transactions.nro_folio)
                + ' (usd ' + str(items_transactions.importe_usd) + ')')
            else:
                items_concepto.append(str('F ' + items_transactions.nro_folio))
        importe_concepto.append(str(items_transactions.importe_pesos))

    for items_instrument in recibov_view.daily_venta.detallepagoventa_set.all():
        items_formadepago.append(str(items_instrument.instrument_id.forma_pago))
        fecha_formadepago.append(items_instrument.fecha_dep)
        importe_formadepago.append(str(items_instrument.monto_pesos))
        interes_formadepago.append(str(items_instrument.intereses_pesos))

    return render_to_response('index_recibo_ventas_prod.html', { 'nro_recibo_pago_venta': nro_recibo_pago,
        'fecha_recibo_venta': fecha_recibo, 'socio': socio, 'nro_contrato': nro_contrato,
        'ownerid': ownerid, 'direccion': direccion, 'cuit': cuit, 'recibimos_suma':
        recibimos_suma, 'tipo_cambio': tipo_cambio,'importe_aplicado': importe_aplicado,
        'concepto': items_concepto, 'importe_concepto':importe_concepto,
        'forma_pago': items_formadepago, 'fecha_dep': fecha_formadepago,
        'importe_formadepago': importe_formadepago, 'interes_formadepago': interes_formadepago,
        'usuario': usuario, 'url': url }, context_instance=RequestContext(request))

def reciboperu(request, reciboventaperu_id):
    reciboperu_view = ReciboVentaPeru.objects.get(pk=reciboventaperu_id)
    params = request.GET.copy()
    url = '%s?%s' % (request.path, params.urlencode())

    items_concepto = []
    importe_concepto = []
    items_formadepago = []
    fecha_formadepago = []
    importe_formadepago = []
    interes_formadepago = []

    nro_recibo_pago=reciboperu_view.nro_recibo_pago_venta
    fecha_recibo=reciboperu_view.fecha_recibo_venta
    socio=reciboperu_view.socio
    nro_contrato=reciboperu_view.nro_contrato
    ownerid=reciboperu_view.ownerid
    direccion=reciboperu_view.direccion
    cuit=reciboperu_view.cuit
    recibimos_suma=reciboperu_view.recibimos_suma
    tipo_cambio=reciboperu_view.tipo_cambio
    importe_aplicado=reciboperu_view.importe_aplicado
    usuario=reciboperu_view.daily_peru.usuario

    for items_transactions in reciboperu_view.daily_peru.detalletransactionventaperu_set.all():
        if not items_transactions.transaction_codeid == None:
            if items_transactions.importe_usd > 0:
                items_concepto.append(str(items_transactions.transaction_codeid.descripcion)
                + ' (usd ' + str(items_transactions.importe_usd) + ')')
            else:
                items_concepto.append(str(items_transactions.transaction_codeid.descripcion))
        else:
            if items_transactions.importe_usd > 0:
                items_concepto.append(str('F ' + items_transactions.nro_folio)
                + ' (usd ' + str(items_transactions.importe_usd) + ')')
            else:
                items_concepto.append(str('F ' + items_transactions.nro_folio))
        importe_concepto.append(str(items_transactions.importe_pesos))

    for items_instrument in reciboperu_view.daily_peru.detallepagoventaperu_set.all():
        items_formadepago.append(str(items_instrument.instrument_id.forma_pago))
        fecha_formadepago.append(items_instrument.fecha_dep)
        importe_formadepago.append(str(items_instrument.monto_pesos))
        interes_formadepago.append(str(items_instrument.intereses_pesos))

    return render_to_response('index_recibo_ventas_peru_prod.html', { 'nro_recibo_pago_venta': nro_recibo_pago,
        'fecha_recibo_venta': fecha_recibo, 'socio': socio, 'nro_contrato': nro_contrato,
        'ownerid': ownerid, 'direccion': direccion, 'cuit': cuit, 'recibimos_suma':
        recibimos_suma, 'tipo_cambio': tipo_cambio,'importe_aplicado': importe_aplicado,
        'concepto': items_concepto, 'importe_concepto':importe_concepto,
        'forma_pago': items_formadepago, 'fecha_dep': fecha_formadepago,
        'importe_formadepago': importe_formadepago, 'interes_formadepago': interes_formadepago,
        'usuario': usuario, 'url': url }, context_instance=RequestContext(request))

def recibod(request, recibodebito_id):
    recibod_view = ReciboDebito.objects.get(pk=recibodebito_id)
    params = request.GET.copy()
    url = '%s?%s' % (request.path, params.urlencode())

    items_concepto = []
    importe_concepto = []
    fecha_formadepago = []
    importe_formadepago = []
    interes_formadepago = []

    nro_recibo=int(recibod_view.nro_recibo_pago_debito)
    fecha_recibo=recibod_view.fecha_recibo_debito
    socio=recibod_view.socio
    nro_contrato=recibod_view.nro_contrato
    direccion=recibod_view.direccion
    cuit=recibod_view.cuit
    recibimos_suma=recibod_view.recibimos_suma
    banco=recibod_view.bank
    importe_aplicado='$ '+ str(recibod_view.importe_aplicado)
    usuario=recibod_view.usuario
    str_concepto=str(recibod_view.transaction_codeid)
    items_concepto.append(str_concepto.split('|')[1])
    importe_concepto.append('U$S ' + str(recibod_view.total_amount))
    importe_formadepago.append('$ ' + str(recibod_view.importe_aplicado))
    str_forma_pago=str(recibod_view.instrument_id)
    forma_pago=(str_forma_pago.split('|')[1] + 'DEBITO AUT')
    fecha_formadepago.append(recibod_view.fecha_recibo_debito)
    interes_formadepago.append('$ 0.00')
    tipo_cambio=str(recibod_view.tipo_cambio)

    return render_to_response('index_recibo_debitos.html',{ 'nro_recibo': nro_recibo, 'fecha_recibo': fecha_recibo,
       'socio': socio, 'nro_contrato': nro_contrato, 'direccion': direccion, 'cuit': cuit, 'recibimos_suma':
       recibimos_suma, 'importe_aplicado': importe_aplicado, 'usuario': usuario, 'forma_pago': forma_pago,
       'fecha_dep': fecha_formadepago, 'banco': banco, 'concepto': items_concepto, 'importe_concepto': importe_concepto,
       'importe_formadepago': importe_formadepago, 'interes_formadepago': interes_formadepago, 'tipo_cambio': tipo_cambio,
    }, context_instance=RequestContext(request))

def recibovpos(request, recibovpos_id):
    recibod_view = ReciboVPos.objects.get(pk=recibovpos_id)
    params = request.GET.copy()
    url = '%s?%s' % (request.path, params.urlencode())

    items_concepto = []
    importe_concepto = []
    fecha_formadepago = []
    importe_formadepago = []
    interes_formadepago = []

    nro_recibo=int(recibod_view.nro_recibo_pago_vpos)
    fecha_recibo=recibod_view.fecha_recibo_vpos
    socio=recibod_view.socio
    nro_contrato=recibod_view.nro_contrato
    direccion=recibod_view.direccion
    cuit=recibod_view.cuit
    recibimos_suma=recibod_view.recibimos_suma
    banco=recibod_view.bank
    importe_aplicado='$ '+ str(recibod_view.importe_aplicado)
    usuario=recibod_view.usuario
    str_concepto=str(recibod_view.transaction_codeid)
    items_concepto.append(str_concepto.split('|')[1])
    importe_concepto.append('U$S ' + str(recibod_view.total_amount))
    importe_formadepago.append('$ ' + str(recibod_view.importe_aplicado))
    str_forma_pago=str(recibod_view.instrument_id)
    forma_pago=(str_forma_pago.split('|')[1] )
    fecha_formadepago.append(recibod_view.fecha_recibo_vpos)
    interes_formadepago.append('$ 0.00')
    tipo_cambio=str(recibod_view.tipo_cambio)

    return render_to_response('index_recibo_vpos.html',{ 'nro_recibo': nro_recibo, 'fecha_recibo': fecha_recibo,
       'socio': socio, 'nro_contrato': nro_contrato, 'direccion': direccion, 'cuit': cuit, 'recibimos_suma':
       recibimos_suma, 'importe_aplicado': importe_aplicado, 'usuario': usuario, 'forma_pago': forma_pago,
       'fecha_dep': fecha_formadepago, 'banco': banco, 'concepto': items_concepto, 'importe_concepto': importe_concepto,
       'importe_formadepago': importe_formadepago, 'interes_formadepago': interes_formadepago, 'tipo_cambio': tipo_cambio,
    }, context_instance=RequestContext(request))


def reporte(request):
    class ComisionesTable(tables.MemoryTable):
        class Meta:
            sortable = False
        usuario = tables.Column()
        total_comisiones_reservas = tables.Column()
        total_comisiones_cobranzas = tables.Column()
        total_comisiones_llamadas_bienvenida = tables.Column()
        total_comisiones_nuevos_socios = tables.Column()
        total_comisiones_a_cobrar = tables.Column()

    totales = []
    meses = {
	'1': 'Enero',
	'2': 'Febrero',
	'3': 'Marzo',
	'4': 'Abril',
	'5': 'Mayo',
	'6': 'Junio',
	'7': 'Julio',
	'8': 'Agosto',
	'9': 'Septiembre',
	'10': 'Octubre',
	'11': 'Noviembre',
	'12': 'Diciembre',
    }

    fecha=datetime.date.today()
    delta=relativedelta(months=1)
    mes_anterior = (fecha-delta)

    exportable_fields = (
		('usuario', 'Usuario'),
		('total_comisiones_reservas', 'Total Comisiones Reservas'),
		('total_comisiones_cobranzas', 'Total Comisiones Cobranzas'),
		('total_comisiones_llamadas_bienvenida', 'Total Comisiones Llamadas Bienvenida'),
		('total_comisiones_nuevos_socios', 'Total Comisiones Nuevos Socios'),
		('total_comisiones_a_cobrar', 'Total Comisiones a Cobrar'),
    )

    if 'ids' in request.GET:
        ids = request.GET['ids'].split(',')
        users = User.objects.filter(id__in=ids)
    else:
        users = User.objects.all()

    for user in users:
        if not user.is_superuser:
            total_reservas=sum([ reserva.comision() for reserva in
                user.reserva_set.filter(fecha__month=mes_anterior.month,
                    fecha__year=mes_anterior.year) ])
            total_cobranzas=sum([ cobranza.comision() for cobranza in
                user.cobranza_set.filter(fecha__month=mes_anterior.month,
                    fecha__year=mes_anterior.year) ])
            total_llamadas= sum([ llamadadebienvenida.MontoArs for
                llamadadebienvenida in
                user.llamadadebienvenida_set.filter(fecha__month=mes_anterior.month,
                    fecha__year=mes_anterior.year) ])
            total_nuevossocios=sum([ nuevossocio.valor for nuevossocio in
                user.nuevossocio_set.filter(fecha__month=mes_anterior.month,
                    fecha__year=mes_anterior.year) ])
            total_comisiones= (total_reservas + total_cobranzas + total_llamadas
                    + total_nuevossocios)

            totales.append({'usuario':user, 'total_comisiones_reservas': total_reservas,
            'total_comisiones_cobranzas': total_cobranzas,
            'total_comisiones_llamadas_bienvenida': total_llamadas,
            'total_comisiones_nuevos_socios': total_nuevossocios,
            'total_comisiones_a_cobrar':total_comisiones })

    if 'format' in request.GET:
        return generic_export_xls(totales, exportable_fields)
    else:
        table = ComisionesTable(totales)
        params = request.GET.copy()
        params['format'] = 'xls'
        url = '%s?%s' % (request.path, params.urlencode())
    return render_to_response('index_reporte_mensual.html', {'table':table,
        'title':u'Reporte Comisiones Mes de %s del %s' %
        (meses[str(mes_anterior.month)], mes_anterior.year), 'url': url},
        context_instance=RequestContext(request))

def reportes_anteriores(request, reporte_id):
  class ComisionesAnterioresTable(tables.MemoryTable):
    class Meta:
      sortable = False
    usuario = tables.Column()
    total_comisiones_reservas = tables.Column()
    total_comisiones_cobranzas = tables.Column()
    total_comisiones_llamadas_bienvenida = tables.Column()
    total_comisiones_nuevos_socios = tables.Column()
    total_comisiones_a_cobrar = tables.Column()

  totales = []
  users = User.objects.all()
  reporte = ReportesAnteriores.objects.get(id=reporte_id)
  exportable_fields = (
            ('usuario', 'Usuario'),
            ('total_comisiones_reservas', 'Total Comisiones Reservas'),
            ('total_comisiones_cobranzas', 'Total Comisiones Cobranzas'),
            ('total_comisiones_llamadas_bienvenida', 'Total Comisiones Llamadas Bienvenida'),
            ('total_comisiones_nuevos_socios', 'Total Comisiones Nuevos Socios'),
            ('total_comisiones_a_cobrar', 'Total Comisiones a Cobrar'),
            )

  for user in users:
    if not user.is_superuser:
      total_reservas=sum([ reserva.comision() for reserva in
          user.reserva_set.filter(fecha__month=reporte.mes, fecha__year=reporte.anio) ])
      total_cobranzas=sum([ cobranza.comision() for cobranza in
          user.cobranza_set.filter(fecha__month=reporte.mes, fecha__year=reporte.anio) ])
      total_llamadas= sum([ llamadadebienvenida.MontoArs for llamadadebienvenida
          in user.llamadadebienvenida_set.filter(fecha__month=reporte.mes,
              fecha__year=reporte.anio) ])
      total_nuevossocios=sum([ nuevossocio.valor for nuevossocio in
          user.nuevossocio_set.filter(fecha__month=reporte.mes,
              fecha__year=reporte.anio) ])
      total_comisiones= (total_reservas + total_cobranzas + total_llamadas +
              total_nuevossocios)
      totales.append({'usuario':user, 'total_comisiones_reservas': total_reservas,
          'total_comisiones_cobranzas': total_cobranzas,
          'total_comisiones_llamadas_bienvenida': total_llamadas,
          'total_comisiones_nuevos_socios': total_nuevossocios,
          'total_comisiones_a_cobrar':total_comisiones })

  if 'format' in request.GET:
    #return generic_export_xls(totales, exportable_fields)
    return generic_export_pdf(totales, exportable_fields)
  else:
    table = ComisionesAnterioresTable(totales)
    params = request.GET.copy()
    #params['format'] = 'xls'
    params['format'] = 'pdf'
    url = '%s?%s' % (request.path, params.urlencode())
    return render_to_response('index_reportes_anteriores.html', { 'table':table,
        'title':u'Reporte Comisiones %s' % (unicode(reporte)), 'url': url },
        context_instance=RequestContext(request))

def generic_export_xls(queryset, fields):
  response = HttpResponse(mimetype="application/ms-excel")
  response['Content-Disposition'] = 'attachment; filename=filename.xls'
  wb = xlwt.Workbook(encoding='utf-8')
  ws = wb.add_sheet('Sheetname')
  fila=0

  for i,(field, descripcion) in enumerate(fields):
    ws.write(fila, i, unicode(descripcion))
  for obj in queryset:
    fila += 1
    for i,(field, descripcion) in enumerate(fields):
      valor=mygetattr(obj, field)
      if not (type(valor) is Decimal or type(valor) is LongType):
	ws.write(fila, i, unicode(valor))
      if type(valor) is Decimal:
	ws.row(fila).set_cell_number(i,Decimal(valor))
      if type(valor) is LongType:
	ws.row(fila).set_cell_number(i,valor)
  wb.save(response)
  return response

def mygetattr(obj, attr):
  if type(obj) == dict:
    value = obj[attr]
  else:
    value = getattr(obj, attr)
  if callable(value):
    value = value()
  return value

def generic_export_pdf(queryset, fields):
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'

    # Create the PDF object, using the response object as its "file."
    p = canvas.Canvas(response)

    # Draw things on the PDF. Here's where the PDF generation
    # happens.
    # See the ReportLab documentation for the full list of
    # functionality.
    p.drawString(100, 100, "Hello world.")

    # Close the PDF object cleanly, and we're done.
    p.showPage()
    p.save()
    return response
# -*- encoding: utf -*_-8
